Хтось може пояснити attr?


89

Я розглядаю зразок коду галереї стільників ( тут ), і я натрапив на наступний код, намагаючись додати елементи дій у своєму власному додатку:

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

На жаль, це просто робить мене ще більш заплутаним. Що це робить?

Відповіді:


64

У ?attr/menuIconCameraвартість означає , що ікона з menuIconCameraвикористовуватиметься атрибут поточної теми.

menuIconCameraДесь у themes.xmlфайлі повинен бути присвоєний атрибут, який можна призначати . Якщо є дві теми з різними значеннями цього атрибута, тоді фактичний значок буде залежати від теми, яка використовується в даний час.

attrs.xmlФайл використовується для визначення користувача атрибутів. Без цього визначення компілятор буде розглядати невідомі атрибути як помилкові.


1
Ви точно маєте рацію, <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </item>, Велике спасибі. Я бачу, що ic_menu_camera_holo_light - це місцевий малюнок. Чи немає в 3.x вбудованих загальнодоступних піктограм, як у 2.x?
FuegoFingers

Не думаю, що це якось пов’язано з версією Android. Це лише спосіб зробити атрибути залежними від обраної теми.
Майкл

51

?attr:Синтаксис використовується для доступу до атрибутів поточної теми. Див. Посилання на атрибути стилю .


3
Надане посилання було дуже, дуже корисним. Дякую!
sven

3
Дуже корисно, але ви все одно повинні розмістити основні частини цього посилання.
gustavohenke

1
Це була найбільш корисна частина пов’язаної статті: „Ресурс атрибутів стилю дозволяє посилатися на значення атрибута в поточній темі. Посилання на атрибут стилю дозволяє вам налаштувати зовнішній вигляд елементів інтерфейсу, стилізуючи їх відповідно до стандартних варіацій, що надаються поточною темою, замість того, щоб надавати жорстко закодоване значення. Посилання на атрибут стилю, по суті, говорить: "використовуйте стиль, визначений цим атрибутом, у поточній темі." '
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>

Тут значення android:backgroundбуде встановлено, @color/primary_colorоскільки ?attr/colorPrimaryпосилається на @color/primary_colorпоточну тему (AppTheme)


17

Моя англійська мова не гарна, вибачте. Але я знаю це питання

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
Одна річ, яка, здається, ніде не задокументована, це те, що "<ім'я_пакета>" - це повне ім'я пакета будь-якого декларованого ресурсу. Більш конкретно, це не префікс простору імен XML, хоча синтаксис може це натякати. Наприклад, для посилання на attr, оголошений бібліотекою appcompat, використовуйте android.support.v7.appcompat:.
Припиніть шкодити громаді

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.