24

新しい Android データ バインディング ライブラリを使用してカスタム ビューのイベントをバインドしようとしていますが、問題が発生します。

カスタムビューの関連部分は次のとおりです。

public class SuperCustomView extends FrameLayout {
    private OnToggleListener mToggleListener;

    public interface OnToggleListener {
        void onToggle(boolean switchPosition);
    }

    public void setOnToggleListener(OnToggleListener listener) {
        mToggleListener = listener;
    }
    .../...
 }

onToggleこのカスタム ビューを使用して、イベントを次のようにバインドしようとしています。

<data>
    <variable
        name="controller"
        type="com.xxx.BlopController"/>
</data>

<com.company.views.SuperCustomView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       app:onToggle="@{controller.toggleStrokeLimitation}"
       app:custom_title="Blah"
       app:custom_summary="Bloh"
       app:custom_widget="toggle"/>

toggleStrokeLimitationコントローラのメソッドはどこにありますか:

public void toggleStrokeLimitation(boolean switchPosition) {
    maxStrokeEnabled.set(switchPosition);
}

コンパイル時に次のエラーが発生します。

> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'app:onToggle' with parameter type java.lang.Object. file:/path/to/androidapp/app/src/main/res/layout/fragment_stroke.xml loc:36:35 - 36:67 ****\ data binding error ****

android:onToggle代わりに使用しようとしましapp:onToggleたが、同じエラーが発生します。

docのバインディング イベント セクションを読むと、コントローラーから任意のメソッドをイベントに接続できるように感じonToggleます。

controller.toggleStrokeLimitationフレームワークはメソッドを にラップしSuperCustomView.OnToggleListenerますか? onClickフレームワークによって提供される既存の魔法の背後にある種類の魔法について何かヒントはありますか?

4

2 に答える 2

26
@BindingMethods(@BindingMethod(type = SuperCustomView.class, attribute = "app:onToggle", method = "setOnToggleListener"))
public class SuperCustomView extends FrameLayout {
    private OnToggleListener mToggleListener;

    public interface OnToggleListener {
        void onToggle(boolean switchPosition);
    }

    public void setOnToggleListener(OnToggleListener listener) {
        mToggleListener = listener;
    }
    .../...
}

コードをテストするための私のハックは次のとおりです。

public void setOnToggleListener(final OnToggleListener listener) {
    this.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            toggle = !toggle;
            listener.onToggle(toggle);
        }
    });
}

そして私のコントローラーオブジェクトで:

 public class MyController {

    private Context context;

    public MyController(Context context) {
        this.context = context;
    }

    public void toggleStrokeLimitation(boolean switchPosition) {
        Toast.makeText(context, "Toggle" + switchPosition, Toast.LENGTH_SHORT).show();
    }
}

うん!!出来た

または、次のような xml を使用できます。

 <com.androidbolts.databindingsample.model.SuperCustomView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:onToggleListener="@{controller.toggleStrokeLimitation}" />

@BindingMethods アノテーションを追加する必要がなくなりました。

ドキュメントには次のよう に書かれています。 "

于 2015-09-22T11:03:34.367 に答える