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

问题描述 投票:3回答:3

我目前正在尝试使用数据绑定在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是我在action类中定义的方法:

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

我也试过了孩子的观点和那些clickablefocusable设置为false的孩子观点,以及duplicateParentState设置为truefalse

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

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

android data-binding android-studio-3.0
3个回答
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)如上所述,您可以通过数据绑定获得布局点击。希望它能为你效劳。

谢谢

快乐编码!!


0
投票

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

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

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


0
投票

如果无效缓存不起作用。

然后从Build> Rebuild重建项目。修复错误,如果有的话再重建一次。

© www.soinside.com 2019 - 2024. All rights reserved.