LinearLayoutをタップ時にBackgroundの色を変えたい

LinearLayoutを使用してちょっと凝ったボタンみたいなのを作った時に有効。クリックした時に色を変えてちゃんとこいつがクリックされてますよーってのがわかるようにする。

selectorを作る必要があるけど、そこの説明は省略。こことか参考になる

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:background="@drawable/button_sample_background" >

    <ImageView
        android:id="@+id/imgIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:duplicateParentState="true"
        android:src="@drawable/button_sample_icon" />

    <TextView
        android:id="@+id/txtTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:duplicateParentState="true"
        android:textColor="@drawable/button_sample_title" />

</LinearLayout>

重要なのはLinearLayoutのclickableと子Viewに設定しいるduplicateParentState。

clickable
trueを設定するとClickを察知するようになる。
duplicateParentState
trueを設定すると親ViewのClickを優先的に動くようになる。要は親ViewをClickすると子Viewにもそれが伝わる。

この2つを設定することで、LinearLayoutのClickイベントを子Viewに伝えて文字の色を変えたり、画像を差し替えたりしてちょっと凝ったボタンを作ることができる。duplicateParentStateがわからなかったなー。