Android:如何将click事件传播到LinearLayout子项并更改其drawable

时间:2012-04-16 08:40:48

标签: android onclick android-linearlayout

我想创建一个与ImageButton类似的线性布局。

<LinearLayout
    android:id="@+id/container"
    style="?WidgetHomeIconContainer">            

    <ImageView
        android:id="@+id/icon"
        style="?WidgetHomeIcon" />

    <TextView
        android:id="@+id/title"
        style="?WidgetHomeLabel"             
        android:text="@string/title"
        android:textAppearance="?attr/TextHomeLabel" />
</LinearLayout>

在ImageView,TextView和LinearLayout的样式中,我为所有状态设置了一个选择器。

现在:

  • 当我点击ImageView时(我也尝试使用ImageButton) - 它的行为正确,图像根据选择器xml进行了更改。
  • 当我点击LinearLayout时 - 单击线性布局,但ImageView和TextView不会改变它的可绘制/外观

所以我想做以下事情。当我点击父LinearLayout时,我需要将它的所有子项更改为按下状态。

我尝试将以下代码添加到LinearLayout onClickListener以传播点击:

@Override
public void onClick(View v)
{
    LinearLayout l = (LinearLayout) v;
    for(int i = 0; i < l.getChildCount(); i++)
    {
        l.getChildAt(i).setClickable(true);
        l.getChildAt(i).performClick();
    }
}

但它仍然是相同的。非常感谢您的帮助。

5 个答案:

答案 0 :(得分:41)

android:duplicateParentState="true"
您在ImageView和TextView中的

.. then the views get its drawable state (focused, pressed, etc.) from its direct parent rather than from itself.

答案 1 :(得分:4)

不仅为每个孩子做好准备:

android:duplicateParentState="true"

但另外还有:

android:clickable="false"  

如果使用可点击的儿童观点,这将防止意外行为(或解决方案根本无效)。

SO Source

答案 2 :(得分:0)

几个月后遇到同样的问题后,我找到了这个解决方案:

private void setOnClickListeners() {
    super.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            onClick(v);
        }
    });
    for (int index = 0; index < super.getChildCount(); index++) {
        View view = super.getChildAt(index);
        view.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                onClick(v);
            }
        });
    }
}

protected void onClick(View v) {
    // something to do here...
}

答案 3 :(得分:0)

就我而言,没有其他解决方案有效!

我最后必须使用OnTouchListener解释here,在用户点击父视图时捕获事件,并移除所有子项OnClickListener

所以我的想法是,将点击行为委托给父母,并通知真正点击的孩子,如果你想传播这个事件。 这就是我们正在寻找的东西!!

然后,我们需要检查哪个孩子被点击了。您可以找到参考here以了解其完成情况。但这个想法基本上是得到孩子的区域,并询问谁包含点击的坐标,以执行他的行动(或不)

答案 4 :(得分:0)

起初,我的子视图无法获得父级的点击。经过调查,我要做的是使其工作:

  1. 删除子视图上的点击侦听器
  2. 在父视图上添加点击侦听器

因此,我不需要在每个孩子上都添加这些内容。

android:duplicateParentState="true"
android:clickable="false"

我仅将duplicateParentState添加到我的一个子视图中。

我的子视图现在正在监听父级单击事件。