あなたが法医学的な気分になっているなら、ここで何が起こっているのかを掘り下げて見つける方法があります。
android:background="?android:attr/activatedBackgroundIndicator"?
直感的には、これは背景を描画可能なものに設定することを意味します。
しかし、これをさらに分解して、神秘的なドローアブルに到達する方法を見てみましょう。
正確には、「背景属性を、現在のテーマで「activateBackgroundIndicator」が参照する属性に設定する」という意味です。
「現在のテーマで参照する」の部分を理解していれば、基本的に、裏で起こっていることすべてを理解していることになります。
基本的に、activateBackgroundIndicatorは実際のドローアブルではなく、ドローアブルへの参照です。では、「activateBackgroundIndictor」属性は実際にはどこで定義されているのでしょうか。
これは、sdkディレクトリのファイル名attrs.xmlで定義されています。例えば:
path_to_android_sdk / platform / android-17 / data / res / values / attrs.xml
そのファイルを開くと、次のように宣言されます。
<attr name="activatedBackgroundIndicator" format="reference" />
attrs.xmlは、後でビューxmlで使用するすべての属性を宣言する場所です。ここでは、属性とそのタイプを宣言しており、実際には値を割り当てていないことに注意してください。
実際の値はthemes.xmlで割り当てられます。このファイルは次の場所にあります。
path_to_android_sdk / platform / android-17 / data / res / values / themes.xml
そのファイルを開くと、使用しているテーマに応じて複数の定義が表示されます。たとえば、テーマ名Theme、Theme.Light、Theme.Holo、Theme.Holo.Lightの定義はそれぞれ次のとおりです。
<item name="activatedBackgroundIndicator">@android:drawable/activated_background</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item>
これで、不思議なドローアブルができました。最初のものを選択すると、次のドローアブルフォルダで定義されます。
path_to_android_sdk / platform / android-17 / data / res / drawable / activate_background.xml
そのファイルを開くと、何が起こっているのかを理解するために重要なドローアブルの定義が表示されます。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" />
<item android:drawable="@color/transparent" />
</selector>
ここでは、2つの状態でドローアブルを定義しています。デフォルトの状態は単に透明な背景であり、状態が「state_activate」の場合、ドローアブルは「list_selector_background_selected」です。
ドローアブルと状態の背景情報については、このリンクを参照してください。
「list_selector_background_selected」は、drawable-hdpiフォルダーにある9パッチのpngファイルです。
これで、アクティブ化されたBackgroundIndicatorを、ドローアブルファイルに直接リンクするのではなく、参照として定義した理由がわかります。これにより、テーマに応じて適切なドローアブルを選択できます。