誰かが属性を説明できますか?


89

Honeycomb Galleryのサンプルコード(ここ)を見ていて、自分のアプリにアクションアイテムを追加しようとしているときに、次のコードに遭遇しました。

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

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

残念ながら、それは私にとってさらに混乱を招きます。これは何をしているのですか?

回答:


64

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

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

このattrs.xmlファイルは、カスタム属性を定義するために使用されます。この定義がないと、コンパイラは不明な属性をエラーとして扱います。


1
正解です、<item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </ item>、ありがとうございました。ic_menu_camera_holo_lightがローカルドローアブルであることがわかります。3.xには、2.xのようにパブリックアイコンが組み込まれていませんか?
FuegoFingers 2011

どういうわけかAndroid版とは関係ないと思います。これは、選択したテーマに依存する属性を作成する方法にすぎません。
マイケル

51

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


3
提供されたリンクは非常に役に立ちました。ありがとう!
sven 2011年

3
非常に役立ちますが、それでもそのリンクの主要部分を投稿する必要があります。
gustavohenke 2015

1
これは、リンクされた記事の最も役立つ部分でした。 'スタイル属性リソースを使用すると、現在適用されているテーマの属性の値を参照できます。スタイル属性を参照すると、ハードコードされた値を指定する代わりに、現在のテーマで提供される標準のバリエーションに一致するようにUI要素のスタイルを設定することで、UI要素の外観をカスタマイズできます。スタイル属性を参照すると、基本的に「現在のテーマでは、この属性によって定義されたスタイルを使用しています。」と言う」
bigtex777

24

この投稿はとても古いと思いますが、以下の説明は初心者の方にもわかりやすいと思います。

だから素人の言葉で言えば、

someAttribute="?attr/attributeName" 手段 -

someAttributeの値を、現在のテーマのattributeNameの値に設定します

一般的な例は、ツールバーのスタイル設定で発生します

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

ここでは、現在のテーマ(AppTheme)で参照android:backgroundされている@color/primary_colorため、の値がに設定されます。?attr/colorPrimary@color/primary_color


16

私の英語は上手ではありません、ごめんなさい。しかし、私はこの質問を知っています

android:icon="?attr/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>
</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


4

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

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

スタイル属性の参照


3
どこにも文書化されていないように思われることの1つは、「<package_name>」がリソースを宣言したものの完全なパッケージ名であるということです。より具体的には、構文がそれを示唆しているとしても、それはXML名前空間プレフィックスではありません。たとえば、appcompatライブラリによって宣言されたattrを参照するには、を使用しますandroid.support.v7.appcompat:
コミュニティへの害をやめる2014

4

このブログ投稿は、現在のテーマで定義されているスタイル属性の値を参照する方法について、すばらしい仕事をしています:https//trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • ?表記が表示されている場合(これは、スタイル属性を参照しようとしていることを意味します)、現在のテーマによって異なる可能性のある値です。特定のテーマごとにこの属性をオーバーライドできるため、XMLレイアウトを変更する必要はなく、正しいテーマを適用する必要があります。

  • @表記が表示されると、実際のリソース値(色、文字列、寸法など)が参照されます。このリソースには実際の値が必要です。この場合、私たちは自分たちが扱っている価値を正確に知っています。

次に例を示します。

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="LauncherButton" parent="TextAppearance.AppCompat.Medium">
        <item name="android:textColor">?colorAccent</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_centerHorizontal">true</item>
        <item name="android:textAllCaps">false</item>
    </style>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.