【问题标题】:Android Binding - property changingAndroid 绑定 - 属性更改
【发布时间】:2017-06-27 11:17:06
【问题描述】:

我对 Android 绑定库有疑问。当我使用属性更改“_all”时,一切正常,但是当我指定字段时,它不起作用。 我的问题是为什么? :)

public class Person extends BaseObservable{
private String name;

@Bindable
public String getName(){
    return this.name;
}

//IT WORKS
public void setName(String name){
    this.name = name;
    notifyPropertyChanged(BR._all); //<- difference
}

//IT DONT WORK
public void setSurname(String name){
    this.name = name;
    notifyPropertyChanged(BR.name); //<- difference
}

还有我的 xml 文件:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
    <variable
        name="person"
        type="com.myapp.Person" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{person.getName()}" />

</LinearLayout>
</layout>

【问题讨论】:

    标签: android android-layout data-binding android-databinding


    【解决方案1】:

    问题在于您使用的是方法 getName() 而不是属性name。你应该像这样绑定它:

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{person.name}" />
    

    _all 起作用的原因是因为数据绑定认为整个对象是无效的,然后也重新评估了方法。

    【讨论】:

    • 好的,我注意到了,但是如果我想使用 getter 怎么办?改变值的例子 -> return format("Your name is %s", name);唯一的方法是使用全部通知?
    • 在这种特定情况下,您需要使用字符串格式:@{@string/yourName(name)}。但是如果你传递参数,它也会使方法无效,所以你可以使用:@{MyStringFormatter.yourName(user.name)}
    猜你喜欢
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2021-09-01
    • 2015-09-18
    • 2019-03-24
    • 2011-08-10
    相关资源
    最近更新 更多