【问题标题】:Custom setter is not called, when using databinding使用数据绑定时不调用自定义设置器
【发布时间】:2015-12-30 14:47:29
【问题描述】:

我只是遇到了一个问题,使用 android 数据绑定库。

这里是xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<data>
    <import type="com.test.app.ObservableFieldWrapper"/>
    <variable
        name="org"
        type="ObservableFieldWrapper"/>
</data>
<LinearLayout
    android:id="@+id/headerListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">      
    <com.test.app.NSpinner
        android:id="@+id/orgSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:org="@{org.getSilent ? org.content : &quot;silent&quot;}"/>
</LinearLayout>

这是我的 NSpinner:

 public class ObservableFieldWrapper{

    private final ObservableBoolean silent;

    private final ObservableField<String> content;

    @BindingAdapter("org")
    public static void setOrg(Spinner view, String org) {
        assert org != null;
        if (org.equals("silent")) {
           Log.i("ObsWrapper", "SET ORG called via binding adapter but got denied, because of SILENCE");
            } else {
                Log.i("ObsWrapper", "SET ORG called via binding adapter NORMALLY");
                view.setSelection(Cache.GetOrgIndexForSpinner(), true);
            }
    }

    public ObservableFieldWrapper(String startValue) {
        content = new ObservableField<>(startValue);
        silent = new ObservableBoolean();
        silent.set(false);
    }

    public void setContent(String newValue) {
        silent.set(false);
        content.set(newValue);
        content.notifyChange();
    }

    public void setContentSilent(String newValue) {
        silent.set(true);
        content.set(newValue);
    }

  //Bunch of getters
}

并且此调用应该调用 ObservableFieldWrapper 类提供的静态 getter(假设所有绑定都已设置):

ObservableFieldWrapper someField = new ObservableFieldWrapper("someString");
someField.setContent("some other string");

嗯,问题是......它什么都不调用。但是,如果我将 xml 部分从

app:org="@{org.getSilent ? org.content : &quot;silent&quot;}"

普通

app:org="@{org.content}"

它开始工作了!我真的需要这个带有布尔值的额外功能,我真的很想找到这个问题。


找到一个解决方法,在 xml 表达式中没有使用任何逻辑,我只是​​将 2 个参数传递给我的函数并在那里完成了所有工作。

@Bindable ("{org, silent}")

然而,问题仍未得到解答。

【问题讨论】:

  • 你确定这是正确的org.getSilent ? org.content : &amp;quot;silent&amp;quot;。好像你想要app:org='@{org.silent ? "silent" : org.content}'
  • 我确定,但您提供的方式也很好。
  • 你用的是rc1还是rc2?
  • 只是为了好玩,而不是拥有私有的 ObservableFields,而是将它们公开并消除 getter。方法是不可观察的,除非它们被标记为 @Bindable 并且在实现 Observable 的类中。你的表情也会改变:app:org='@{org.silent ? org.content : "silent"}'
  • 谢谢,下次我会试试,不过,我认为在上一个版本中实现了自动获取器,以及在 Bind 类中为可观察字段自动创建所需的条目。

标签: java android data-binding android-databinding


【解决方案1】:

正如 George Mount 所提到的 - 删除可观察字段上的任何 getter 很重要,否则它将不起作用,我花了很多时间处理这个问题,然后提到我有一个 getter,在删除它之后 - 一切都开始工作了。

【讨论】:

    猜你喜欢
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多