it-swarm.com.ru

Может кто-нибудь объяснить attr?

Я просматриваю пример кода в Сотовой галерее ( здесь ) и наткнулся на следующий код, пытаясь добавить элементы действий в свое собственное приложение:

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

К сожалению, это только делает меня еще более запутанным. Что это делает?

77
FuegoFingers

Значение ?attr/menuIconCamera означает, что будет использоваться значок из атрибута menuIconCamera текущей темы.

Где-то в файле themes.xml должен быть атрибут draw, назначенный атрибуту menuIconCamera. Если есть две темы с разными значениями этого атрибута, то фактический значок будет зависеть от темы, которая используется в данный момент.

Файл attrs.xml используется для определения пользовательских атрибутов. Без этого определения компилятор будет считать неизвестные атрибуты ошибочными.

54
Michael

Синтаксис ?attr: используется для доступа к атрибутам текущей темы. Смотрите ссылки на атрибуты стиля .

46
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 ссылается на @color/primary_color в текущей теме (AppTheme)

17
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

14
dawn

Это для атрибутов стиля refering. см. 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>
0
nazmul idris