我想创建一个线性布局,将类似的行为的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相同。 非常感谢您的任何帮助。
放
android:duplicateParentState="true"
在您的ImageView和TextView的.. 然后将欣赏到它的直接父,而不是从自身获得其绘制状态(聚焦,按下等)。
不仅使每一个孩子:
android:duplicateParentState="true"
而且额外的:
android:clickable="false"
这将阻止如果使用可点击子视图意外的行为(或解决方案根本不工作)。
SO源
几个月后有同样的问题后,我发现这个解决方案:
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...
}
在我的情况下,其他解决方案没有一个作品!
我终于不得不用OnTouchListener
作为解释在这里 ,捕捉事件,当用户点击父视图,并删除所有孩子的OnClickListener
。
这样的想法是, 委派点击行为给家长,并通知确实是点击,如果你想传播的情况下为儿童 。 ¡¡这就是我们正在寻找的!
然后,我们需要检查已单击的孩子。 你可以找到一个参考这里知道如何it's完成。 但这个想法是basiclly得到孩子的领域,并要求谁包含点击坐标,来执行他的行动(或没有)。
起初,我的孩子观点未能得到父母点击。 经过调查,我需要做什么,使其工作有:
- 去除子视图点击监听器
- 在父视图中添加点击监听器
所以,我并不需要添加这些在每一个孩子。
android:duplicateParentState="true"
android:clickable="false"
我只添加duplicateParentState
到我的子视图之一。
我的孩子观点正听父点击事件。
文章来源: Android: How to propagate click event to LinearLayout childs and change their drawable