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をクリックすると、すべての子を押された状態に変更する必要があります。
クリックを伝播するために、LinearLayoutonClickListenerに次のコードを追加しようとしました。
@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();
}
}
しかし、それでも同じことが言えます。助けてくれてありがとう。
プット
Android:duplicateParentState="true"
imageViewとTextViewで.. その後、ビューは、それ自体からではなく、直接の親から描画可能な状態(フォーカス、押されたなど)を取得します。
すべての子供のために作るだけではありません:
Android:duplicateParentState="true"
しかし、さらに:
Android:clickable="false"
これにより、クリック可能な子ビューが使用されている場合に、予期しない動作(またはソリューションが単に機能しない)を防ぐことができます。
最初、私の子ビューは親からクリックを取得できませんでした。調査した後、それを機能させるために私がする必要があることは次のとおりです。
したがって、すべての子供にこれらを追加する必要はありません。
Android:duplicateParentState="true"
Android:clickable="false"
子ビューの1つにduplicateParentState
を追加するだけです。
私の子ビューは現在、親のクリックイベントをリッスンしています。
数ヶ月後に同じ問題を抱えた後、私はこの解決策を見つけました:
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
を削除しました。
つまり、クリック動作を親に委任し、イベントを伝播する場合は、実際にクリックされた子に通知するという考え方です。 ¡¡それが私たちが探しているものです!!
次に、どの子がクリックされたかを確認する必要があります。あなたはそれがどのように行われるかを知るために参照 ここ を見つけることができます。しかし、アイデアは基本的に子供の領域を取得し、クリックされた座標を含む人を尋ねて、彼のアクションを実行することです(またはしない)。