我想创建一个与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的样式中,我为所有状态设置了一个选择器。
现在:
所以我想做以下事情。当我点击父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();
}
}
但它仍然是相同的。非常感谢您的帮助。
答案 0 :(得分:41)
放
android:duplicateParentState="true"
您在ImageView和TextView中的
答案 1 :(得分:4)
不仅为每个孩子做好准备:
android:duplicateParentState="true"
但另外还有:
android:clickable="false"
如果使用可点击的儿童观点,这将防止意外行为(或解决方案根本无效)。
答案 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)
起初,我的子视图无法获得父级的点击。经过调查,我要做的是使其工作:
因此,我不需要在每个孩子上都添加这些内容。
android:duplicateParentState="true"
android:clickable="false"
我仅将duplicateParentState
添加到我的一个子视图中。
我的子视图现在正在监听父级单击事件。