安卓:如何click事件传播到孩子的的LinearLayout和改变自己绘制(Android: Ho

2019-07-28 23:57发布

我想创建一个线性布局,将类似的行为的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();
    }
}

但它仍然reamins相同。 非常感谢您的任何帮助。

Answer 1:

android:duplicateParentState="true"

在您的ImageView和TextView的.. 然后将欣赏到它的直接父,而不是从自身获得其绘制状态(聚焦,按下等)。



Answer 2:

不仅使每一个孩子:

android:duplicateParentState="true"

而且额外的:

android:clickable="false"  

这将阻止如果使用可点击子视图意外的行为(或解决方案根本不工作)。

SO源



Answer 3:

几个月后有同样的问题后,我发现这个解决方案:

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...
}


Answer 4:

在我的情况下,其他解决方案没有一个作品!

我终于不得不用OnTouchListener作为解释在这里 ,捕捉事件,当用户点击父视图,并删除所有孩子的OnClickListener

这样的想法是, 委派点击行为给家长,并通知确实是点击,如果你想传播的情况下为儿童¡¡这就是我们正在寻找的!

然后,我们需要检查已单击的孩子。 你可以找到一个参考这里知道如何it's完成。 但这个想法是basiclly得到孩子的领域,并要求谁包含点击坐标,来执行他的行动(或没有)。



Answer 5:

起初,我的孩子观点未能得到父母点击。 经过调查,我需要做什么,使其工作有:

  1. 去除子视图点击监听器
  2. 在父视图中添加点击监听器

所以,我并不需要添加这些在每一个孩子。

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

我只添加duplicateParentState到我的子视图之一。

我的孩子观点正听父点击事件。



文章来源: Android: How to propagate click event to LinearLayout childs and change their drawable