在带有子级的LinearLayout上没有触发onClick

时间:2011-07-20 14:52:37

标签: android onclick android-linearlayout

我有一个带有较小TextView子项的自定义LinearLayout。我希望能够单击TextView未覆盖的区域,因此我将clickable = true和onclicklistener设置为LinearLayout,但不会触发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();
            }
        });
    }
}

14 个答案:

答案 0 :(得分:85)

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

要使您的布局可以与其子项一起使用,您需要为每个 孩子 添加此选项:

 android:clickable="false"

然后点击处理将 向上 转到

答案 1 :(得分:55)

为每个孩子

  

机器人:duplicateParentState = “真”

答案 2 :(得分:20)

这不是你的情况,但我在点击ViewGroup时遇到了类似的问题。在寻找解决方案一小时后,发现我在android:inputTypeTextView设置了ViewGroup阻止了onClick()监听器(不明白为什么)

  

不要将android:inputType与TextView

一起使用

答案 3 :(得分:2)

您的TextView高度覆盖整个父级(整个布局),因此您可以单击空白区域而不是布局。尝试使用wrap_content for android:layout_height为您的TextView。同时为布局设置单击侦听器。

答案 4 :(得分:2)

您没有使用自定义视图;你正在使用标准的LinearLayout。您的XML标记应为:

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

答案 5 :(得分:2)

android:duplicateParentState="true"使我的 TextView 看起来已被禁用,并且无法接收点击事件。

您只需设置 TextView clickable="false"即可。因此,click事件将调度到父布局, TextView 仍然可以对触摸事件做出反应(具有连锁效果)。

答案 6 :(得分:1)

要确保的一件事是另一个视图不在您尝试单击的视图之上。这在FrameLayouts(可能覆盖您的子LinearLayout)或相对布局中尤其常见,您可能忘记更新此行:

android:layout_below="@id/shouldBeTheIdOfTheViewCurrentlyBeingCovered"

以便观看次数不会填充相同的空间。

答案 7 :(得分:1)

让你的父母LinearLayout android:clickable =&#34; true&#34;

制作所有儿童视图 android:clickable =&#34; false&#34;

在Linearlayout下 - 从TextView中删除 android:inputType =&#34;&#34;

答案 8 :(得分:0)

问题可能来自其布局中android:layout_height="fill_parent"的textview。如果这不能解决问题,则问题可能是onClick()事件。线性布局实际上可能不会调用onClick(),因为它的布局。请尝试改写onTouch()事件侦听器。

答案 9 :(得分:0)

如果相关观看次数为TextView,您可能需要将其设置为focusable="false",以便不会将第一次点击重点放在文字视图上。

答案 10 :(得分:0)

将以下属性添加到linearlayout 任何未由子视图处理的Click事件都将自动传递给LinearLayout。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...
    android:focusable="true"
    android:clickable="true">

<child/>
<child/>

</LinearLayout>

答案 11 :(得分:0)

我遇到了同样的问题,并且所有的XML属性都没有用。我不确定是否会发生这种情况,因为我以编程方式膨胀并添加了视图,但这就是我解决问题的方法。

我有一个使用TextView和ImageView扩展LinearLayout的类。 在给布局充气并获取视图之后,我为子视图分配了一个OnClickListener,当按下它时,执行LineaLayout的onClickListner。

public class MyView extends LinearLayout {
private OnClickListener clickListener;
ImageView imageView;
TextView textView;

@Override
public void setOnClickListener(@Nullable OnClickListener l) {
    super.setOnClickListener(l);
    clickListener = l;
}

void afterViews() {
    imageView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            clickListener.onClick(MyView.this);
            return false;
        }
    });
    textView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            clickListener.onClick(MyView.this);
            return false;
        }
    });
}

我也尝试重写OnTouchListener,但后来我的孩子观点没有产生连锁反应,这是我需要的。

答案 12 :(得分:0)

以上所有解决方案都不适合我。我注意到LinkMovementMethod内的TextView设置为LinearLayout。此类拦截触摸事件,点击事件和TextView的属性,例如可点击,可聚焦的vs ..

答案 13 :(得分:0)

为LinearLayout创建变量

LinearLayout layout;
layout.setOnClicknersetOnClickListener(new View.OnClickListener()
        {
            public void onClick(View v)
            {                   
                Toast t = Toast.makeText(context, "hey!", Toast.LENGTH_SHORT);
                t.show();
            }
        });