使用数据绑定时不调用自定义 setter
Custom setter is not called, when using databinding
我刚刚 运行 遇到了一个问题,使用 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 : "silent"}"/>
</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 class 提供的静态 getter(假设所有绑定都已设置):
ObservableFieldWrapper someField = new ObservableFieldWrapper("someString");
someField.setContent("some other string");
好吧,问题是...它不调用任何东西。但是,如果我将 xml 部分从
更改为
app:org="@{org.getSilent ? org.content : "silent"}"
普通
app:org="@{org.content}"
它开始工作了!我真的需要布尔值的这个额外功能,我真的迷失了寻找问题的方法。
找到了解决方法,其中没有在 xml 表达式中使用任何逻辑,我只是将 2 个参数传递给我的函数并在那里完成了所有工作。
@Bindable ("{org, silent}")
然而,这个问题仍然没有答案。
正如 George Mount 提到的那样 - 删除可观察字段上的任何 getter 很重要,否则它不会起作用,我在这个问题上花了很多时间然后提到我有一个 getter,删除它后 - 一切开始工作。
我刚刚 运行 遇到了一个问题,使用 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 : "silent"}"/>
</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 class 提供的静态 getter(假设所有绑定都已设置):
ObservableFieldWrapper someField = new ObservableFieldWrapper("someString");
someField.setContent("some other string");
好吧,问题是...它不调用任何东西。但是,如果我将 xml 部分从
更改为app:org="@{org.getSilent ? org.content : "silent"}"
普通
app:org="@{org.content}"
它开始工作了!我真的需要布尔值的这个额外功能,我真的迷失了寻找问题的方法。
找到了解决方法,其中没有在 xml 表达式中使用任何逻辑,我只是将 2 个参数传递给我的函数并在那里完成了所有工作。
@Bindable ("{org, silent}")
然而,这个问题仍然没有答案。
正如 George Mount 提到的那样 - 删除可观察字段上的任何 getter 很重要,否则它不会起作用,我在这个问题上花了很多时间然后提到我有一个 getter,删除它后 - 一切开始工作。