web-dev-qa-db-ja.com

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をクリックすると、すべての子を押された状態に変更する必要があります。

クリックを伝播するために、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();
    }
}

しかし、それでも同じことが言えます。助けてくれてありがとう。

19
Bhiefer
43
5hssba

すべての子供のために作るだけではありません:

Android:duplicateParentState="true"

しかし、さらに:

Android:clickable="false"  

これにより、クリック可能な子ビューが使用されている場合に、予期しない動作(またはソリューションが単に機能しない)を防ぐことができます。

SOソース

4
Evusas

最初、私の子ビューは親からクリックを取得できませんでした。調査した後、それを機能させるために私がする必要があることは次のとおりです。

  1. 子ビューのクリックリスナーを削除します
  2. 親ビューにクリックリスナーを追加する

したがって、すべての子供にこれらを追加する必要はありません。

Android:duplicateParentState="true"
Android:clickable="false"

子ビューの1つにduplicateParentStateを追加するだけです。

私の子ビューは現在、親のクリックイベントをリッスンしています。

0
aldok

数ヶ月後に同じ問題を抱えた後、私はこの解決策を見つけました:

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

私の場合、他の解決策はどれも機能しません!

説明したように、最終的にOnTouchListenerを使用する必要がありました ここ 、ユーザーが親ビューをクリックしたときのイベントをキャプチャし、すべての子OnClickListenerを削除しました。

つまり、クリック動作を親に委任し、イベントを伝播する場合は、実際にクリックされた子に通知するという考え方です。 ¡¡それが私たちが探しているものです!!

次に、どの子がクリックされたかを確認する必要があります。あなたはそれがどのように行われるかを知るために参照 ここ を見つけることができます。しかし、アイデアは基本的に子供の領域を取得し、クリックされた座標を含む人を尋ねて、彼のアクションを実行することです(またはしない)

0
IgniteCoders