【问题标题】:How to set click listener to LinearLayout using data binding如何使用数据绑定将点击侦听器设置为 LinearLayout
【发布时间】:2018-09-09 18:50:57
【问题描述】:

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

我已经设法让它在 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 的子视图。

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

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

【问题讨论】:

  • 暂时忽略数据绑定。如果您删除android:onClick() 属性,并在您的LinearLayout 上调用setOnClickListener(),您会得到您想要的结果吗?
  • @CommonsWare 是的,代码内点击监听器在 LinearLayout 上正常工作。
  • 嗯...您可能会考虑查看由数据绑定生成的代码,并在您拥有 android:onClick 属性时查看其中的内容。您所拥有的应该没问题,尽管您正在尝试的组合(通过非交互式 View 上的数据绑定注册的事件处理程序)可能尚未经过彻底测试。
  • 使用 android:onClick="linearLayoutClicked" 而不是 android:onClick="@{action::linearLayoutClicked}" 我试过并且它的工作原理
  • @Thomas 阅读我的示例,它已经在使用具有该值的该属性。

标签: android data-binding android-studio-3.0


【解决方案1】:

您可以处理任何视图点击事件,如下所示:

  1. 为处理点击事件创建接口,如下所示:

    interface OnClickHandlerInterface {
        void onClick(View view)
    }
    
  2. 在action类中实现点击监听,如下所示:

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

    <data>
        <variable
            name="clickHandler"
            type=".OnClickHandlerInterface" />
    </data>
    
  4. 现在使用绑定对象在动作类中注册这个接口:

    mActivityMainBinding.clickHandler = this
    
  5. 现在在任何你想设置点击监听器的地方设置 onClick。对你来说,它是 LinearLayout:

    <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>
    
  6. 现在当你的linearLayout点击时处理点击,你可以点击在action类中实现的界面:

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

【讨论】:

    【解决方案2】:

    所以一切都设置正确,生成的绑定文件显示点击侦听器设置正确,但由于一些非常奇怪的原因,一半的绑定正常工作,而新的绑定则没有。较新的意思是 LinearLayout 以及围绕它的所有尝试。

    解决问题的是一个简单的缓存失效和相应的重新启动,瞧,点击监听器在LinearLayout 上运行良好。请记住将其设置为 clickablefocusable 并将任何子视图设置为不可点击,这样它们就不会在父视图之前消耗事件。

    【讨论】:

      【解决方案3】:

      如果无效缓存不起作用。

      然后从Build>Rebuild Rebuild 项目。如果有任何错误,请修复错误,然后再次重建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-30
        • 2014-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多