86

選択したコンテキストアクションバーを表示するときに、リスト内の選択したアイテムを強調表示する方法を探していました。見つけた解決策android:backgroundは、行レイアウトxmlの属性をに設定することでした"?android:attr/activatedBackgroundIndicator"

しかし、これを設定するとどのように機能しますか?

  1. 関与するメカニズムは何ですか?
  2. 「?」、「attr」、「activateBackgroundIndicator」などの構文要素はどういう意味ですか?
  3. 「activateBackgroundIndicator」の意味はどこで定義されていますか?
4

4 に答える 4

221

あなたが法医学的な気分になっているなら、ここで何が起こっているのかを掘り下げて見つける方法があります。

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を、ドローアブルファイルに直接リンクするのではなく、参照として定義した理由がわかります。これにより、テーマに応じて適切なドローアブルを選択できます。

于 2013-04-10T05:49:20.250 に答える
13

ある時、これも気になりました。大量のAndroidリソースはブラックボックスのように見え、直接見ることはできません。どこかで見当たらないかもしれませんが、SDKのソースコードで見つかりません。これが私が知っていることです。

  • android:backgroundドローアブルを取ります。
  • 構文はスタイルです

    「@[+][package:] type:name」の形式の別のリソースへの参照、または「?[package:] [type:]name」の形式のテーマ属性への参照である必要があります

この場合、?はパッケージ内のテーマを確認することを意味し、名前が。androidのタイプです。attractivatedBackgroundIndicator

コードビハインドでもこれにアクセスできるはずですandroid.R.attr.activatedBackgroundIndicator

Androidのattrプロパティのリストは、R.attrにあります。

  • activatedBackgroundIndicatorはAndroid3.0以降で定義されたドローアブルです

    アクティブ化されたアイテムの背景として使用されるドローアブル。

基本的にはOSで定義されている標準的な項目です。Androidのソースで見つけることができないようですが、ここにドキュメントへのリンクがあります。activateBackgroundIndicator

于 2013-02-21T17:16:54.077 に答える
5

これは、テーマから値を付加する形式です。テーマの値はその時点ではわからない可能性があるため、リソースのコンパイル中は値が技術的にわかりません。代わりに、値は(最も一般的には)から取得された実際のテーマに基づいて実行時に解決されますContextThemeWrapper

これは、リソース値を再利用する方法を提供します。ここでは、パフォーマンスの観点からではなく、組織と保守の観点から話します。属性は、実行時に実際の値を保持することを約束した変数として機能します。

このアプローチでは、さらにカスタマイズすることもできます。たとえば、ウィンドウの背景のドローアブルの値をハードコーディングする代わりに、テーマから実際のドローアブルを取得し、選択した属性をキーとして提供します。これにより、その属性の値をオーバーライドできます。あなたは単にする必要があります:

  1. 独自のテーマ(これは「スタイル」リソースの単なる名前です)を作成します。最も一般的なのは、デフォルトのテーマの1つから派生したものです。
  2. 問題の属性に独自の値を指定します。

アクティビティまたはアプリケーションのテーマを指定した場合、プラットフォームは自動的に値を使用します。あなたは質問で説明されているようにこれを行います。テーマ属性参照の一般的な構文については、次のとおりです。スタイル属性の参照。そこには、メカニズム全体の例と説明もあります。

編集

注意すべきことの1つは、実際の属性名と、さまざまなプラットフォームバージョンでのそれらの存在です。新しい属性が次のプラットフォームバージョンで導入されることはかなり一般的です。たとえば、ActionBarスタイリングの目的でバージョン3.0で追加されたものもあります。

属性名はAPIの一部として扱う必要があります。つまり、属性名は使用が許可されているコントラクトの一部です。これは、クラスとその署名に非常に似ています。このクラスの目的は、いくつかのソース(チュートリアル、リファレンス、公式ガイドなど)からわかっているLocationManagerため、最後のデバイスの場所を取得する目的でクラスを使用します。同様に、属性名とその目的は、Androidプラットフォームのドキュメントで(場合によってはうまく、時には惨めに)定義されています。

于 2013-02-21T17:32:59.290 に答える
2

更新:APIガイドから入手できるより詳細なバージョンがあるので、引用したいと思います。

スタイル属性リソースを使用すると、現在適用されているテーマの属性の値を参照できます。スタイル属性を参照すると、ハードコードされた値を指定する代わりに、現在のテーマで提供される標準のバリエーションに一致するようにUI要素のスタイルを設定することで、UI要素の外観をカスタマイズできます。スタイル属性を参照すると、基本的に「現在のテーマで、この属性によって定義されたスタイルを使用する」という意味になります。

スタイル属性を参照するには、名前の構文は通常のリソース形式とほぼ同じですが、アットマーク(@)の代わりに疑問符(?)を使用し、リソースタイプの部分はオプションです。例: `

元の回答:

numan salatiはすでに完璧な答えを提供していますが、「?」には対応していません。構文。APIガイドからの引用ですリソースへのアクセス

スタイル属性を参照するには、名前の構文は通常のリソース形式とほぼ同じですが、アットマーク(@)の代わりに疑問符(?)を使用し、リソースタイプの部分はオプションです。例えば:

?[<package_name>:] [<resource_type> /] <resource_name>

于 2016-06-08T07:02:40.797 に答える