1. ホーム
  2. android

[解決済み] android:attr/activatedBackgroundIndicator "はどのように機能するのですか?

2023-05-20 18:48:41

質問

選択項目に対するコンテキストアクションバーを表示する際に、リスト内の選択項目をハイライトする方法を探していたところ、私が見つけた解決法は android:background 属性を、行レイアウト xml の "?android:attr/activatedBackgroundIndicator" .

しかし、これを設定するとどのように動作するのでしょうか?

  1. どのようなメカニズムなのでしょうか?
  2. のような構文要素は何を意味するのでしょうか?
  3. activatedBackgroundIndicator" の意味はどこで定義されていますか?

どのように解決するのですか?

もしあなたが科学捜査の気分であるなら、ここで掘り下げて何が起こっているのかを見つける方法について説明します。

android:background="?android:attr/activatedBackgroundIndicator"?

直感的には、背景を何らかのdrawableに設定することを意味します。

しかし、これをさらに分解して、謎のdrawableにどうやってたどり着くかを見てみましょう。

正確には、background 属性を "activatedBackgroundIndicator" 属性の値に設定する、ということです。 が現在のテーマで参照しているものです。 .

という部分がわかれば、基本的に裏側はすべて理解できていることになります。

基本的には activatedBackgroundIndicator は実際の drawable ではなく、drawable への参照です。 . では、quot;activateBackgroundIndictor" 属性は実際にどこで定義されているのでしょうか?

sdkディレクトリのファイル名で定義されています。 attrs.xml . 例えば

パス_to_android_sdk/platforms/android-17/です。 data/res/values/attrs.xmlになります。

そのファイルを開くと、以下のような宣言があります。

<attr name="activatedBackgroundIndicator" format="reference" />

attrs.xmlは、後でビューxmlで使用するすべての属性を宣言する場所です。 ここでは属性とその型を宣言しており、実際に値を代入していないことに注意してください。 .

実際の値は themes.xml . このファイルは以下の場所にあります。

パス_to_android_sdk/プラットフォーム/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>

さて、これで不思議なdrawableが出来上がりました。最初のものを選ぶと、それはdrawableフォルダの中で次のように定義されています。

パス_to_android_sdk/platforms/android-17/にあります。 データ/res/drawable/activated_background.xml

このファイルを開くと、何が起こっているかを理解するために重要な、drawableの定義が表示されます。

<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>

デフォルトの状態は透明な背景で、状態が "state_activated" である場合、描画可能な状態は "list_selector_background_selected" となります。

参照 このリンク を参照してください。

"list_selector_background_selected" は、drawable-hdpi フォルダにある 9 パッチの png ファイルです。

これで、なぜ私たちが activatedBackgroundIndicator を drawable ファイルに直接リンクするのではなく、参照として定義したのかがわかるでしょう。