Привязка данных Android: в сгенерированном коде отсутствует оператор возврата при неоднократном вызове адаптера привязки
Я использую библиотеку привязки данных Android и архитектуру MVVM. В макете xml я определяю переменную с именем viewModel типа 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;
}
}
}
За пределами коммутатора нет ни регистра по умолчанию, ни оператора возврата. Это вызывает ошибку, но я был почти уверен, что случай по умолчанию не требуется, когда обрабатывается каждый случай... В любом случае, когда я возвращаюсь к 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;
}
Компилятор снова доволен, но мне нужно использовать адаптер привязки более одного раза. Как я могу заставить библиотеку добавить оператор возврата? Есть ли обходной путь?
Я использую Android Studio 3.4 Preview. Спасибо всем
1 ответ
@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)