Android-support-design ライブラリが提供するボトムシートのバインディング アダプターを作成しています。私が達成しようとしているのは、状態変更イベントを監視可能なフィールドにバインドすることです。したがって、イベント ハンドラーのグルー コードを完全に回避します。
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 のフィールドです。
その後、コンパイラは警告します:Cannot find the setter for attribute 'bind:behavior_onStateChange' with parameter type int.
データ バインディング コンパイラは、BindingAdapter と一致するときに ObservableInt フィールドを常に int として扱うようです。
ビューモデルクラスのグルーコードなしで、イベントハンドラーをバインドして Observable フィールドを変更する BindingAdapter を実際に作成するにはどうすればよいですか?