Shawn
Shawn

Reputation: 1382

DataBinding Listeners

I'm trying to use Data binding to run a function when an onClick event occurs, I'm hoping someone can tell me what I'm doing wrong here.

The log item in myClick doesn't run.

XML

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="myBinding"
            type="com.example.deletebindingtest.MyFragment" />
    </data>

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MyFragment"
        android:orientation="vertical">

        <Button
            android:id="@+id/my_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/button"
            android:onClick="@{(view) -> myBinding.myClick()}"/>

    </androidx.appcompat.widget.LinearLayoutCompat>
</layout>

My Fragment

class MyFragment : Fragment() {  
  private lateinit var binding: FragmentMyBinding

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        // Inflate view and obtain an instance of the binding class
        binding = DataBindingUtil.inflate(
            inflater,
            R.layout.fragment_my,
            container,
            false
        )

        binding.lifecycleOwner = viewLifecycleOwner
        return binding.root
    }


    fun myClick() {
        Log.i("TEST", "Its working")
    }
}

When I click on the extension in the XML it takes me to myClick function.

Upvotes: 0

Views: 92

Answers (1)

Mohammed Alaa
Mohammed Alaa

Reputation: 3320

a Quick fix is on onCreateView add binding.myBinding=this

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

    // Inflate view and obtain an instance of the binding class
    binding = DataBindingUtil.inflate(
        inflater,
        R.layout.fragment_my,
        container,
        false
    )

    binding.lifecycleOwner = viewLifecycleOwner
    binding.myBinding=this // here
    return binding.root
}

also I prefer listener binding you can check it here

Upvotes: 1

Related Questions