如何使用数据绑定将点击监听器设置给LinearLayout

11

我目前正在尝试使用数据绑定将点击监听器设置到LinearLayout视图中的.xml布局文件上。

我已经成功地在其他视图上实现了它,比如ButtonTextView,但因某种原因,在LinearLayout上不起作用。

以下是我尝试的基本内容,但仍然无法使其工作:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="72dp"
    android:clickable="true"
    android:focusable="true"
    android:onClick="@{action::linearLayoutClicked}"
    android:orientation="vertical">
</LinearLayout>

其中linearLayoutClicked是我在操作类中定义的方法:

public void linearLayoutClicked(View view) {
    // specific logic
}

我也尝试了使用子视图和这些子视图设置为clickablefocusable都设置为false,同时将duplicateParentState设置为truefalse

该操作与其他正常工作的视图上正在使用的操作完全相同。

这是一个bug还是我做错了?为什么这在LinearLayout上不起作用,但在其他视图上没有任何问题?


暂时忽略数据绑定。如果您删除android:onClick()属性,并在您的LinearLayout上调用setOnClickListener(),您会得到想要的结果吗? - CommonsWare
@CommonsWare 是的,在代码中的点击监听器在 LinearLayout 上可以正常工作。 - Shadow
生成的绑定文件显示了与其他工作视图设置相同的结构,除了视图类型外没有任何不同。 - Shadow
1
@Thomas 请阅读我的示例,它已经使用了该属性和该值。 - Shadow
@akhilesh0707 我对你所说的表示怀疑,我刚刚尝试了一下,应用程序由于“找不到方法linearLayoutClicked”而崩溃。 - Shadow
显示剩余7条评论
3个回答

21

您可以按照以下方式处理任何视图点击事件:

  1. 创建以下处理点击事件的接口:

    interface OnClickHandlerInterface {
        void onClick(View view)
    }
    
  2. 按照以下示例在操作类中实现该单击监听器:

  3. class MainActivity implements OnClickHanderInterface{
        @Override
        void OnClick(View view){
        }
    }
    
    现在将这个接口绑定到 XML 文件中:
  4. 现在将此接口绑定到XML文件中:

  5. <data>
        <variable
            name="clickHandler"
            type=".OnClickHandlerInterface" />
    </data>
    
  6. 现在使用绑定对象将此接口注册到操作类中:

  7. mActivityMainBinding.clickHandler = this
    
  8. 现在在您想设置点击监听器的任何控件上设置onClick。对于您来说,它是LinearLayout:

  9. <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="match_parent"
        android:layout_height="72dp"
        android:clickable="true"
        android:focusable="true"
        android:onClick="@{(v)-> clickHandler.onClick(v)}"
        android:orientation="vertical">
    </LinearLayout>
    
  10. 现在处理当你的线性布局被点击时,可以获取在操作类中实现的接口上的单击:

  11. @Override
    void OnClick(View view){
        switch(view.getId()){
        case R.id.linearLayout:
            // Handler click and do some actions
            break;
        }
    }
    
  12. 如上所述,您可以通过数据绑定获取布局点击。


3
所以,一切都正确设置,并且生成的绑定文件显示点击监听器设置正确,但由于某种非常奇怪的原因,一半的绑定是有效的,而更新的绑定则无效。指的是LinearLayout和其周围所有尝试。

问题的解决方法是简单的缓存失效和相关重启,然后瞧,点击监听器在LinearLayout上完美地工作。只需记住将其设置为可点击clickablefocusable,并将任何子视图设置为不可单击,以便在父级之前不会消耗事件。

0
如果“使缓存无效”无效。
那么从“生成> 重建”重新构建项目。如果有错误,请修复后再次重建。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接