4

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 を実際に作成するにはどうすればよいですか?

4

1 に答える 1