Java Android数据绑定:多次调用自定义绑定适配器时,生成的代码中缺少return语句
我正在使用android数据绑定库和MVVM架构。在xml布局中,我定义了一个名为viewModel的变量,类型为myViewModel。布局有几个TextInputItemText,我使用了以下自定义绑定适配器:Java Android数据绑定:多次调用自定义绑定适配器时,生成的代码中缺少return语句,java,android,kotlin,android-databinding,android-binding-adapter,Java,Android,Kotlin,Android Databinding,Android Binding Adapter,我正在使用android数据绑定库和MVVM架构。在xml布局中,我定义了一个名为viewModel的变量,类型为myViewModel。布局有几个TextInputItemText,我使用了以下自定义绑定适配器: //makes the drawable_right of the TextView clickable @SuppressLint("ClickableViewAccessibility") @BindingAdapter("onDrawableRightClick") inlin
//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()}”
添加到其中一个文本InputItemText,然后单击run。一切正常,没问题
现在我返回并将app:onDrawableRightClick=“@{()->viewModel.doOtherThing()}”
添加到第二个文本InputItemText。这次编译失败,出现错误:缺少返回语句
错误在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;
}
}
}
开关外部既没有默认情况,也没有返回语句。这会导致错误,但我非常确定,在处理每个案例时,不需要使用默认案例。。。无论如何,当我回到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)MyFragmentBindingImpl代码是自动生成的,即使您修改它,它也会更改。我遇到了同样的问题。我使用的是l,在同一个布局中使用了两个不同的绑定适配器。适配器具有相同的参数:
()=>Any
。正如@ABr所提到的,我创建了具有不同签名的侦听器。谢谢return@setOnTouchListenerfalse
而不是false
,并且侦听器基于接口,而不是Kotlin。