誰かがattrを説明できますか?


58

私は(here)ハニカムギャラリーサンプルコードで探していますし、私自身のアプリでアクション項目を追加しようとしたとき、私は次のコードに出会っ:

<item android:id="@+id/camera" 
    android:title="Camera" 
    android:icon="?attr/menuIconCamera" 
    android:showAsAction="ifRoom" /> 

?attrは、ループのための私を投げています。誰かがこれが何をしているのか説明してくださいこれはドロウアブルにどのように関連していますか?私はGoogleで良い情報を見つけることができないようです。 menuIconCameraではなく、アイコンとして使用できる属性のリストやギャラリーもありますか?

おかげ

編集: は、私の周り探していくつかのより多く行なったし、そのattrs.xmlは次のようになりますが見つかりました:

<resources> 
<declare-styleable name="AppTheme"> 
    <attr name="listDragShadowBackground" format="reference" /> 
    <attr name="menuIconCamera" format="reference" /> 
    <attr name="menuIconToggle" format="reference" /> 
    <attr name="menuIconShare" format="reference" /> 
</declare-styleable> 

は、残念ながらそれはちょうどそれがさらに混乱私のためになります。これは何ですか?

39

?attr/menuIconCameraの値は、現在のテーマのmenuIconCameraのアイコンが使用されることを意味します。

menuIconCamera属性に割り当てられたドロウアブルが、themes.xmlファイルのどこかに存在する必要があります。この属性の値が異なる2つのテーマがある場合、実際のアイコンは現在使用されているテーマに依存します。

attrs.xmlファイルはカスタム属性の定義に使用されます。この定義がなければ、コンパイラは未知の属性を誤ったものとして扱います。

+1

<code>@color/primary_color</code>に設定されます、あなたは正確に正しいです、<項目名= "menuIconCamera">描画可能/ ic_menu_camera_holo_light</item> @、ありがとうそんなに。私はic_menu_camera_holo_lightがローカルの描画可能であることを知っています。 3.xは2.xのような公共のアイコンを持っていませんか? 21 9月. 112011-09-21 19:02:18

  0

私はそれが何とかAndroidのバージョンに接続されているとは思わない。これは、選択したテーマに依存する属性を作成する単なる方法です。 21 9月. 112011-09-21 19:30:22


38

?attr:の構文は、現在のテーマの属性にアクセスするために使用されます。 referencing style attributesを参照してください。

+3

付属のリンクはとても役に立ちました。ありがとう! 28 10月. 112011-10-28 11:19:01

+3

非常に役に立ちますが、そのリンクの主要部分を投稿する必要があります。 16 9月. 152015-09-16 04:49:39

+1

これは、リンクされた記事の中で最も役に立つ部分でした。 'スタイル属性リソースを使用すると、現在適用されているテーマの属性の値を参照できます。スタイル属性を参照すると、ハードコードされた値を提供するのではなく、現在のテーマで提供されている標準のバリエーションに合わせてスタイルを設定して、UI要素の外観をカスタマイズできます。スタイル属性を参照すると、「現在のテーマでこの属性で定義されているスタイルを使用してください」というメッセージが表示されます。 25 8月. 162016-08-25 03:41:41


4

これは、スタイル属性を参照するためのものです。 R.attr

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

Referencing style attributes

+3

どこにも書かれていないようですが、 '<package_name>'はリソースを宣言したものより具体的には、XML名前空間接頭辞ではありません。 たとえば、appcompatライブラリによって宣言されたattrを参照するには、 'android.support.v7.appcompat:'を使用します。 05 6月. 142014-06-05 16:04:31


13

私の英語を参照して申し訳ありませんが、良いではありません。しかし、私は、私はこのポストは非常に古いですけど、

android:icon="?attr/menuIconCamera"

<resources> 
    <declare-styleable name="AppTheme"> 
     <attr name="listDragShadowBackground" format="reference" /> 
     <attr name="menuIconCamera" format="reference" /> 
     <attr name="menuIconToggle" format="reference" /> 
     <attr name="menuIconShare" format="reference" /> 
    </declare-styleable> 
</resources> 

のstyles.xml

<style name="AppTheme.Light" parent="@android:style/Theme.Holo.Light"> 
     <item name="android:actionBarStyle">@style/ActionBar.Light</item> 
     <item name="android:windowActionBarOverlay">true</item> 
     <item name="listDragShadowBackground">@android:color/background_light</item> 
     <item name="menuIconCamera">@drawable/ic_menu_camera_holo_light</item> //this.... 
     <item name="menuIconToggle">@drawable/ic_menu_toggle_holo_light</item> 
     <item name="menuIconShare">@drawable/ic_menu_share_holo_light</item> 
    </style> 

使用@drawable/ic_menu_camera_holo_light

  0

これは最も明白な答えだと思います。 08 8月. 172017-08-08 19:27:13


9

attrs.xmlを使いたいこの質問を知っていますしかし、私は次の説明が初心者の助けになると感じるそれを簡単に理解する。

だから素人の用語で、

someAttribute="?attr/attributeName"は意味 -

たattributeNameの値が

現在のテーマで一般的な例であるものは何でもsomeAttributeの値を設定しますツールバーのスタイリングで発生する

は、現在のテーマ(AppTheme)に@color/primary_colorを参照しているためandroid:background
<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> 
     <item name="colorPrimary">@color/primary_color</item> 
     //some more stuff here 
</style> 
<!-- custom toolbar style --> 
<style name="myToolbar" parent="Widget.AppCompat.Toolbar"> 
     <item name="android:background">?attr/colorPrimary</item> 
    //some code here 
</style> 

ここで値が