LinearLayoutをタップ時にBackgroundの色を変えたい(詳細)

せっかくコメントを頂いたので詳細版を。

作るもの(左:押す前、右:押した後)

/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lnrButton"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="left|center"
    android:clickable="true"
    android:background="@xml/linear" >

    <ImageView
        android:id="@+id/imgBefore"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:duplicateParentState="true"
        android:src="@xml/img" />

    <TextView
        android:id="@+id/txtTitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:duplicateParentState="true"
        android:textColor="@xml/text"
        android:text="Sample Title" />

    <ImageView
        android:id="@+id/imgAfter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:duplicateParentState="true"
        android:src="@xml/img" />

</LinearLayout>

/res/xml/linear.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:state_pressed="true" >
        <color android:color="#555" />
    </item>
    <item android:state_pressed="false">
        <color android:color="#000" />
    </item>

</selector>

/res/xml/text.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:state_pressed="true"
        android:color="#FF0" />

    <item android:state_pressed="false"
        android:color="#FFF" />

</selector>

/res/xml/img.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:state_pressed="true"
        android:drawable="@android:drawable/btn_star_big_on" />

    <item
        android:state_pressed="false"
        android:drawable="@android:drawable/btn_star_big_off" />

</selector>

ざっくり解説

各要素でタップ時に変更したい要素についてselector要素を指定している。selector要素のstate_pressedが押されているかどうか。trueなら押されていて、falseなら押されていない。それぞれで設定したい値をitemに書き込む。後は前回書いたようにclickできるようにしてあげればきちんと動く。本当はSelectorのxmlファイルはdrawableフォルダに入れてあげたほうがいいのかもしれないけど、ごちゃごちゃしてわかりにくくなるから僕はxmlフォルダに入れる派(*1)。itemの各状態についてはここらへんが参考になるかも。

一応動作確認したので動くはずです。もしもっといいやり方があれば教えてください。

*1: 別にこだわりがあるわけじゃないからすぐに辞めるかも