gpt4 book ai didi

java - 如何在内部控制中传递 ObservableField

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:24 25 4
gpt4 key购买 nike

主视图模型如下所示:

class MainVM{
public ObservableField<String> title;
public ObservableField<Boolean> isFlexible;
}

主要布局如下:

<layout>
<date><variable name="item" type="MainVM"></data>
<LinearLayout>
<TextView text="@{item.title}"/>
<CustomCtrl1 vm="@{item.isFlexible}">
</LinearLayout>
</layout>

CustomCtrl的布局看起来有点像

   <layout>
<date><variable name="item" type="boolean"></data>
<LinearLayout>
...
<Switch checked="@{item}"/>
...
</LinearLayout>
</layout>

问题是 ObservableField来自 MainVM传递给 CustomCtrl 时将其转换为 boolean 值然后在 CustomCtrl 中更改 boolean 值不影响MainVM的。第一个想法是改变CustomCtrl's来自 Boolean 的 View 模型至 ObservableField<Boolean>但出于某种原因这是不允许的。

所以问题是 - 什么是传递 ObservableField 的正确方法?在内部控制中。

最佳答案

最好的方法是直接使用双向绑定(bind)。这需要 Android Studio 2.1 及以上版本。 Android Studio 2.2 修复了自定义控件可能会遇到的通货膨胀错误。如果您使用的是 include 而不是自定义控件,那将是微不足道的:

<layout>
<date><variable name="item" type="MainVM"></data>
<LinearLayout>
<TextView android:text="@{item.title}"/>
<include layout="@layout/other" app:vm="@={item.isFlexible}">
</LinearLayout>
</layout>

其他的布局:

<layout>
<date><variable name="item" type="boolean"></data>
<LinearLayout>
...
<switch android:checked="@={item}"/>
...
</LinearLayout>
</layout>

对于自定义控件,您必须自己实现监听器。这意味着您必须有一个该属性的监听器。我认为这应该可行(我现在在平板电脑上,所以我无法验证):

@InverseBindingMethods({
InverseBindingMethod(type = CustomControl.class, attribute="vm")})
public class CustomCtrl extends View {
private CustomCtrlBinding binding;
private InverseBindingAdapter listener;

public CustomCtrl(...) {
binding = ...
binding.addOnPropertyChangedCallback(new OnPropertyChangedCallback() {
@Overriide
public void OnPropertyChanged(Observable sender, int propertyId) {
if (listener != null) {
listener.onChange();
}
}
});
}

@Bindable
public boolean getVm() { return binding.getItem(); }

public void setVm(boolean vm) {
binding.setItem(vm);
}

@BindingAdapter("vmAttrChanged")
public static void setListener(CustomCtrl view,
InverseBindingListener listener) {
view.listener = listener;
}
}

那么你就有了双向绑定(bind):

<layout>
<date><variable name="item" type="MainVM"></data>
<LinearLayout>
<TextView android:text="@{item.title}"/>
<CustomCtrl app:vm="@={item.isFlexible}">
</LinearLayout>
</layout>

和自定义控件布局:

<layout>
<date><variable name="item" type="boolean"></data>
<LinearLayout>
...
<switch android:checked="@={item}"/>
...
</LinearLayout>
</layout>

我通常会编写一个自定义控件,它有自己的属性监听器,但 InverseBindingListener 在紧要关头工作。

关于java - 如何在内部控制中传递 ObservableField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38876503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com