gpt4 book ai didi

android - 是否可以使用 BindingAdapter 直接将事件绑定(bind)到 Observable 字段?

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

我正在为 android-support-design 库提供的底页编写一个绑定(bind)适配器。我想要实现的是将状态更改事件绑定(bind)到一个可观察字段,从而完全避免事件处理程序的胶水代码。

public class BottomSheetBindingAdapter {

@BindingAdapter("behavior_onStateChange")
public static void bindBottomSheetStateChange(final View view, final ObservableInt state) {
final BottomSheetBehavior<View> behavior = BottomSheetBehavior.from(view);
if (behavior == null) throw new IllegalArgumentException(view + " has no BottomSheetBehavior");
behavior.setBottomSheetCallback(new BottomSheetCallback() {

@Override public void onStateChanged(@NonNull final View bottomSheet, final int new_state) {
state.set(new_state);
}

@Override public void onSlide(@NonNull final View bottomSheet, final float slideOffset) {}
});
}
}

在布局 XML 中:

bind:behavior_onStateChange="@{apps.selection.bottom_sheet_state}"

其中“bottom_sheet_state”是 ObservableInt 的一个字段。

然后编译器警告:找不到参数类型为 int 的属性“bind:behavior_onStateChange”的 setter 。似乎数据绑定(bind)编译器在匹配 BindingAdapter 时总是将 ObservableInt 字段视为 int。

我如何真正编写一个 BindingAdapter 来绑定(bind)事件处理程序以更改 Observable 字段,而无需 View 模型类中的胶水代码?

最佳答案

您不能更改 BindingAdapter 中的 ObservableInt 值并期望它反射(reflect)在 View 模型中。您在这里想要的是双向绑定(bind)。由于没有开箱即用的 bottomSheetState 属性,我们需要通过创建 InverseBindingAdapter 来创建双向绑定(bind)。

@InverseBindingAdapter(
attribute = "bottomSheetState",
event = "android:bottomSheetStateAttrChanged"
)
fun getBottomSheetState(view: View): Int {
return BottomSheetBehavior.from(view).state
}
@BindingAdapter(value = ["android:bottomSheetStateAttrChanged"], requireAll = false)
fun View.setBottomSheetStateListener(inverseBindingListener: InverseBindingListener) {
val bottomSheetCallback = object : BottomSheetBehavior.BottomSheetCallback() {
override fun onStateChanged(bottomSheet: View, @BottomSheetBehavior.State newState: Int) {
inverseBindingListener.onChange()
}

override fun onSlide(bottomSheet: View, slideOffset: Float) {}
}
BottomSheetBehavior.from(this).addBottomSheetCallback(bottomSheetCallback)
}

顺便说一句,这是 Kotlin 代码。将此添加到顶层的任何 kt 文件中。然后你可以在 xml 中使用像 app:bottomSheetState="@={viewModel.bottomSheetState}"bottomSheetStateObservableInt

现在您可以在 bottomSheetState 上观察 bottom sheet 的状态变化。

关于android - 是否可以使用 BindingAdapter 直接将事件绑定(bind)到 Observable 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35685630/

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