web-dev-qa-db-ja.com

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

Honeycomb Galleryのサンプルコード( 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>

残念ながら、それは私をさらに混乱させています。これは何をしていますか?

84
FuegoFingers

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

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

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

60
Michael

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

49
Peter Knego

私はこの投稿が非常に古いことを知っていますが、次の説明は初心者が簡単に理解するのに役立つと思います。

素人の言葉で言えば、

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>

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

21
sziraqui

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

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

15
dawn

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

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

スタイル属性の参照

4
Michele

このブログ投稿では、現在のテーマで定義されているスタイル属性の値を参照する方法について、素晴らしい仕事をしています: 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>
2
nazmul idris