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

时间:2018-03-30 18:13:49

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

我目前正在尝试使用数据绑定设置点击侦听器到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的子视图

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

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

3 个答案:

答案 0 :(得分:4)

您可以处理如下所示的任何视图点击事件。希望它有所帮助!

1)为下面的句柄点击事件创建界面。

interface OnClickHandlerInterface {
    void onClick(View view)
}

2)在动作类中实现click侦听器,如下所示

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时,你可以点击你可以点击动作类中实现的界面。

@Override
void OnClick(View view){
    switch(view.getId()){
    case R.id.linearLayout:
        // Handler click and do some actions
        break;
    }
}

6)如上所述,您可以通过数据绑定获得布局点击。希望它对你有用。

由于

快乐编码!!

答案 1 :(得分:0)

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

解决问题的原因是简单的缓存失效以及相应的重启和瞧,点击监听器在LinearLayout上完美运行。只需记住将其设置为clickablefocusable,并将所有子视图设置为不可点击,这样他们就不会在父级之前使用该事件。

围绕这一天整整3天,在评论中花了不到10分钟的时间与其他人讨论,记住试图使Android Studio的缓存失效,令我难以置信......

答案 2 :(得分:0)

如果Invalidate Cache不起作用。

然后从 Build> Rebuild 中进行 Rebuild 项目。修复错误(如果有),然后重新构建。