Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Two-way binding cannot resolve a setter for java.lang.String property

I am playing with the two-way binding of the data binding API which was introduced in Android Studio 2.1 AFIK.

I get this interesting error:

Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:The expression address.street cannot cannot be inverted: Two-way binding cannot resolve a setter for java.lang.String property 'street'
file:/path/to/layout.xml
loc:34:37 - 34:50 ****\ data binding error ****

When I try to google that error I just find a 4 day old Japanese Twitter posting from a guy who is crying about it...

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/edit_hint_zip"
    android:text="@={address.zip}"
    tools:text="12345"/>

That address.zip is a String. I am guessing that the problem here is CharSequence vs. String as the return value of EditText.getText().

My idea was to defining it however this does not work for me:

@NonNull
@InverseBindingAdapter(attribute = "text")
public static String getText(EditText edit) {
    return edit.getText().toString();
}

What did I miss?

like image 926
rekire Avatar asked Apr 30 '16 19:04

rekire


2 Answers

If you are working with kotlin , make sure data class field used for two way binding is declared as var. If it is val unable to support two way binding

like image 156
vishnuc156 Avatar answered Nov 01 '22 16:11

vishnuc156


This bug is ugly as hell and properly a bug in the data binding API. The solution is to generate a setter and a getter. I came up fast with the idea to create a setter, but not to create a getter.

Here is now my simplified model:

public class Address {
    public String street;

    public void setStreet(String street) {
        this.street = street;
    }

    public String getStreet() {
        return street;
    }
}

As you may note the getter and setter are useless, but required for two way binding.

If you think that this is a bug of the API please star my bug report: Two-way binding required setters AND ALSO getters

like image 31
rekire Avatar answered Nov 01 '22 16:11

rekire