LinearLayout的子项未触发onClick事件

77
我有一个带有较小TextView子视图的自定义LinearLayout。 我希望能够点击TextView未覆盖的区域,因此我将clickable设置为true,并在LinearLayout上设置了onclicklistener,但是onClick没有被触发。 如果我在TextView上设置onclick监听器,那么它会按预期工作...
有人可以帮忙吗?
ar_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ar_item" android:layout_width="202dp"
    android:layout_height="62dp" android:background="@drawable/bg_item_ar"
    android:clickable="true">

    <TextView android:id="@+id/ar_item_txt"
        android:layout_width="164dp" android:layout_height="fill_parent"
        android:paddingBottom="8dp" android:paddingLeft="8dp"
        android:paddingTop="8dp" android:paddingRight="6dp" android:gravity="center"
        android:background="#50000000" />

</LinearLayout>

我的自定义LinearLayout

public class ARView extends LinearLayout
{    

    public ARView(final Context context, String name, String id)
    {        
        super(context);  
        getLayoutInflater().inflate(R.layout.ar_item, this ,true);
        LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
        inflater.inflate(R.layout.ar_item, null);

        TextView textView = (TextView) findViewById(R.id.ar_item_txt);
        textView.setText(name);

        setOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {                   
                Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
                t.show();
            }
        });
    }
}
15个回答

123

android:duplicateParentState="true" 并没有帮助我。

为了使你的布局及其子视图可点击,你需要为每个子视图添加此选项:

 android:clickable="false"

然后点击处理将会向传递到父级元素


4
谢谢@Yurets,它的运作就像魔法一样。这必须是可以接受的答案。 - Vishal G. Gohel
谢谢。对我也有用! - Yesha
1
没错 - 成功了。我的问题是我的子元素是按钮(本质上是可点击的),所以我必须将它们更改为ImageViews。我不知道我为什么一开始要用按钮。 - JCutting8
如果布局中需要有可点击的子元素怎么办? - ekashking
然后您可以跳过为这些子项设置android:clickable="false"。@ekashking - Yurets

67

适用于每个子元素

android:duplicateParentState="true"


2
谢谢,这解决了我类似的问题。我有多个控件想要表达“点击”视觉状态,同时只需在父级中处理事件。 - Rollie
3
谢谢!解决了我遇到的嵌套线性布局选择问题。 - my code smells
@jaydroider 在 LL 的子元素中,所以我猜是 TextView。 - Blackbelt
1
仍需设置每个子项 android:clickable="false"。 - Vishal G. Gohel
1
这并不总是有效... 请参考此链接... https://dev59.com/yGw15IYBdhLWcg3wMo8Y#31578111...或者将以下内容应用到子级> android:clickable="false" - Tarit Ray
显示剩余2条评论

24

这可能与你的情况不同,但我曾有过可点击的ViewGroup类似的问题。在寻找解决方案一个小时后,我发现我在我的ViewGroup中设置了TextViewandroid:inputType,导致onClick()监听器被阻止(不知道为什么)。

不要在TextView中使用android:inputType


谢谢!我搞不清楚为什么我的TextView会拦截点击。 - MrPlow
2
这也是我的问题,确保您没有输入类型或将其设置为无!感谢您发布此内容。 - Adam William Larson
除非我看到了你的答案,否则对我来说什么都不起作用,因为我的TextView没有输入类型。 - Usama Saeed US

10

将您的父级LinearLayout设置为android:clickable="true"

将所有子视图的android:clickable="false"

在LinearLayout中,从TextView中删除android:inputType=""


5
< p > android:duplicateParentState="true" 会使我的 TextView 看起来像是被禁用了,无法接收点击事件。

你只需要设置 TextViewclickable="false"。这样点击事件会分发到父布局,而 TextView 仍然可以对触摸事件做出反应(带有涟漪效果)。


2

您没有使用自定义视图,而是使用了标准的LinearLayout。您的XML标签应该是:

<com.yourcode.ARView ...> ... </com.yourcode.ARView>

2

您的TextView高度覆盖整个父布局(整个布局),因此您可能会在空白区域上单击,而不是在布局上。尝试为您的TextView使用wrap_content作为android:layout_height。同时为布局设置点击监听器。


TextView的宽度小于其父控件,因此在线性布局的右侧应该保留一个可点击区域。 - jul

1
如果涉及的视图是 TextView,您可能需要将它们设置为 focusable="false",以便第一次点击不用于聚焦文本视图。

1
确保另一个视图不在您试图单击的视图之上是一件非常重要的事情。这在FrameLayouts(其中您的子LinearLayout可能被覆盖)或相对布局中特别常见,您可能忘记更新此行:
android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"

以便视图不占用相同的空间。


0

我遇到了同样的问题,所有的XML属性都没有起作用。我认为这是因为我通过编程方式填充并添加视图。对我来说解决方法是 - 同样通过编程方式 - 将填充的根视图设置为不可点击:

View view = layoutInflater.inflate(R.layout.some_layout, someLinearLayout, false);
view.setClickable(false);

(是的,我试图在XML中使some_layout不可点击。)


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