Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pass another view as parameter in data binding

I am trying to pass a another view of my xml as a parameter of a method in Google data binding... like this:

<LinearLayout
    android:id="@+id/faq_subject_about_ego"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/border_faq_btn"
    android:orientation="horizontal"
    android:layout_marginBottom="20dp"
    android:padding="4dp"
    android:gravity="center"
    android:onClick='@{(faq_title_about) -> viewModel.subjectRequest(faq_title_about.getText())}'>

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/icon_faq"
        android:layout_marginRight="8dp"
        android:clickable="false" />

    <ebanx.com.ego.utils.custom_extension.CustomButtonBold
        android:id="@+id/faq_title_about"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        style="@style/Button_FAQ"
        android:text="@string/btn_about_ego"
        android:clickable="false" />
</LinearLayout>

I need the text that is in my CustomButtonBold... But this is not working.

How can I pass the text of the button as a parameter?

Any help is appreciated!

like image 786
Leandro Borges Ferreira Avatar asked Mar 29 '17 21:03

Leandro Borges Ferreira


People also ask

Can I use both data binding and view binding?

View binding doesn't support layout variables or layout expressions, so it can't be used to declare dynamic UI content straight from XML layout files. View binding doesn't support two-way data binding.

Is view binding faster than findViewById?

Databinding is really faster compared to findViewById and setText . Not only performance, It is also much faster and maintainable for mid, full-scale projects. As a side note, benefits include: performance.

What is data binding with example?

Data binding can also mean that if an outer representation of the data in an element changes, then the underlying data can be automatically updated to reflect the change. For example, if the user edits the value in a TextBox element, the underlying data value is automatically updated to reflect that change.


2 Answers

The member generated for the id-able has a CamelCase name format. Also the view provided to the OnClickListener is the view being clicked. So just name the parameter arbitrarily and use the correct "global" member.

android:onClick='@{(v) -> viewModel.subjectRequest(faqTitleAbout.getText())}'
like image 189
tynn Avatar answered Oct 05 '22 22:10

tynn


If you are coding in Kotlin you could be tempted to write the following:

android:onClick='@{(v) -> viewModel.subjectRequest(faqTitleAbout.text)}'

It won't work, because the binding class is generated by the framework in Java. Another problem is that with EditText views you need to add also a call to

toString()

If you want to call a function that takes a string as parameter. So the code would be:

android:onClick='@{(v) -> viewModel.subjectRequest(faqTitleAbout.getText().toString())}'

That's how it works with Kotlin and Android Studio 4.1.2, otherwise you get a build error (...a weird one...). I don't know if that will change in the future or it has a different behavior with other versions.

like image 27
Sergiob Avatar answered Oct 06 '22 00:10

Sergiob