私はアンドロイドのデータバインディングライブラリと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)