Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass a function with arguments in Android custom data binding

I have a tab layout. I want to call "onTabChanged" function in a view model when user clicked on a tab. So far I have tried this:

@BindingAdapter("onTabChanged")
fun setOnTabChanged(tabLayout: TabLayout, onTabChanged: (TabLayout.Tab) -> Unit) {
    tabLayout.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
        override fun onTabSelected(tab: TabLayout.Tab?) {
            tab?.let {
                onTabChanged(it)
            }
        }
        override fun onTabUnselected(tab: TabLayout.Tab?) {}
        override fun onTabReselected(tab: TabLayout.Tab?) {}
    })
}

In layout.xml:

<data>
    <variable
        name="viewModel"
        type="com.janfranco.ui.menu.MenuViewModel" />
</data>

...

app:onTabChanged="@{viewModel::onTabChanged}"

In view model:

fun onTabChanged(tab: TabLayout.Tab) { }

In layout, I got the following error: Listener class 'kotlin.jvm.functions.Function1<? super com.google.android.material.tabs.TabLayout.Tab,kotlin.Unit>' with method 'invoke' did not match signature of any method 'app:onTabChanged'

How can I solve this?

like image 542
Jan Franco Avatar asked Nov 22 '25 19:11

Jan Franco


1 Answers

In your viewModel instead of this :

fun onTabChanged(tab: TabLayout.Tab) { }

you should have this :

 val onTabChanged = { tab: TabLayout.Tab -> }
like image 117
i30mb1 Avatar answered Nov 24 '25 09:11

i30mb1



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!