Androidのデータバインディング:生成されたコードで行方不明returnステートメントを複数回カスタム結合アダプタを呼び出すとき

AaronJ:

私はアンドロイドのデータバインディングライブラリとMVVMアーキテクチャを使用しています。XMLでは、私はタイプmyViewModelのビューモデルという名前の変数を定義するレイアウト。レイアウトは、私は次のカスタム結合アダプタを使用しているため、いくつかのTextInputEditTextがあります。

//makes the drawable_right of the TextView clickable
@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("onDrawableRightClick")
inline fun TextView.setOnDrawableRightClick(crossinline f: () -> Unit) {
    this.setOnTouchListener(View.OnTouchListener { _, event ->
        if (event.action == MotionEvent.ACTION_UP) {
            if (event.rawX >= this.right - this.paddingRight - this.compoundDrawables[DRAWABLE_RIGHT].bounds.width()) {
                f()
                return@OnTouchListener true
            }
        }
        false
    })
}

レイアウトでは、私は追加app:onDrawableRightClick="@{() -> viewModel.doThing()}"TextInputEditTextの一つだけにして実行]をクリックします。すべてが、何の問題も機能しません。

今私は戻って、追加app:onDrawableRightClick="@{() -> viewModel.doOtherThing()}"二TextInputEditTextに。この時のコンパイルがで失敗しますerror: missing return statement

エラーコードのこのブロックで、MyFragmentBindingImpl(生成)です。

public final kotlin.Unit _internalCallbackInvoke(int sourceId ) {
    switch(sourceId) {
        case 1: {
            // localize variables for thread safety
            // viewModel
            com.example.MyViewModel viewModel = mViewModel;
            // viewModel != null
            boolean viewModelJavaLangObjectNull = false;

            viewModelJavaLangObjectNull = (viewModel) != (null);
            if (viewModelJavaLangObjectNull) {

                   viewModel.doOtherThing();
            }
            return null;
        }
        case 2: {
            // localize variables for thread safety
            // viewModel
            com.example.MyViewModel viewModel = mViewModel;
            // viewModel != null
            boolean viewModelJavaLangObjectNull = false;

            viewModelJavaLangObjectNull = (viewModel) != (null);
            if (viewModelJavaLangObjectNull) {

                viewModel.doThing();
            }
            return null;
        }  
    }
}

デフォルトのケースでもスイッチのreturn文の外でもないがあります。これは、エラーの原因が、私はかなり確信して、すべてのケースを扱う場合、デフォルトの場合は必要ではないことだった...とにかく、私は戻ってXMLに行くとリスナーのバインディングのいずれかを削除すると、MyFragmentBindingImplはこれに変更します。

public final kotlin.Unit _internalCallbackInvoke(int sourceId ) {
    // localize variables for thread safety
    // viewModel
    com.example.MyViewModel viewModel = mViewModel;
    // viewModel != null
    boolean viewModelJavaLangObjectNull = false;

    viewModelJavaLangObjectNull = (viewModel) != (null);
    if (viewModelJavaLangObjectNull) {

      viewModel.doThing();
    }
    return null;
}

コンパイラは、再び幸せですが、私は複数回結合アダプタを使用する必要があります。どのように私は図書館がreturn文を追加することができますか?回避策はありますか?

私は、Android Studioの3.4のプレビューを使用しています。皆さんありがとう

アブラハムマシュー:
@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("onDrawableEndClick")
fun setOnDrawableEndClick(view: TextView, listener: OnCompoundDrawableClickListener?) {
    val padding = 10
    if (listener != null) {
        view.setOnTouchListener { _, event ->
            if (event.action == MotionEvent.ACTION_DOWN) {
                if (view.compoundDrawables[DRAWABLE_RIGHT] == null) return@setOnTouchListener false
                else if (event.rawX >= (view.right - view.compoundDrawables[DRAWABLE_RIGHT].bounds.width() - padding)) {
                    listener.onDrawableEnd()
                    return@setOnTouchListener true
                }
            }
            return@setOnTouchListener false
        }
    }
}

私は、リスナーのためのカスタムインタフェースを使用していますこのような何かを試してみてください(OnCompoundDrawableClickListener)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=168050&siteId=1