首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android数据绑定:在多次调用自定义绑定适配器时,在生成的代码中缺少返回语句

Android数据绑定:在多次调用自定义绑定适配器时,在生成的代码中缺少返回语句
EN

Stack Overflow用户
提问于 2018-11-23 09:23:01
回答 1查看 2.4K关注 0票数 18

我正在使用android数据绑定库和MVVM架构。在xml布局中,我定义了一个名为viewModel (类型为myViewModel )的变量。布局有几个TextInputEditText,我使用了以下自定义绑定适配器:

代码语言:javascript
运行
复制
//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中的一个,然后单击run。一切正常,没问题。

现在我返回并将app:onDrawableRightClick="@{() -> viewModel.doOtherThing()}"添加到第二个TextInputEditText中。这一次编译在error: missing return statement中失败。

错误出现在MyFragmentBindingImpl (生成)中,在这段代码中:

代码语言:javascript
运行
复制
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将更改为:

代码语言:javascript
运行
复制
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;
}

编译器又高兴了,但是我需要不止一次使用绑定适配器。如何使库添加返回语句?有解决办法吗?

我正在使用AndroidStudio3.4Preview。谢谢大家

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-26 05:01:53

代码语言:javascript
运行
复制
@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)使用自定义接口。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53443784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档