Estou olhando para o código de amostra da Galeria Honeycomb ( aqui ) e encontrei o código a seguir ao tentar adicionar itens de ação em meu próprio aplicativo:
<item android:id="@+id/camera"
android:title="Camera"
android:icon="?attr/menuIconCamera"
android:showAsAction="ifRoom" />
O ?attr
está me deixando confuso. Alguém pode explicar o que isso está fazendo? Como isso está relacionado a um drawable? Não consigo encontrar nenhuma boa informação no Google. Também existe uma lista ou galeria de atributos que podemos usar para ícones em vez de apenas menuIconCamera
?
obrigado
Edit: Eu olhei mais um pouco e descobri que attrs.xml se parece com isto:
<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>
Infelizmente, isso torna tudo ainda mais confuso para mim. O que isso está fazendo?
fonte
A
?attr:
sintaxe é usada para acessar os atributos do tema atual. Consulte os atributos de estilo de referência .fonte
Sei que esta postagem é muito antiga, mas acho que a explicação a seguir ajudará os iniciantes a entendê-la facilmente.
Então, em termos leigos,
someAttribute="?attr/attributeName"
significa -Um exemplo comum ocorre na estilização de uma barra de ferramentas
<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>
Aqui, o valor de
android:background
será definido como@color/primary_color
porque?attr/colorPrimary
se refere a@color/primary_color
no tema atual (AppTheme)fonte
Meu inglês não é bom, desculpe. Mas eu conheço esta questão
android:icon="?attr/menuIconCamera"
quer usarattrs.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>
usar
@drawable/ic_menu_camera_holo_light
fonte
Isso é para referenciar atributos de estilo. veja R.attr
?[<package_name>:][<resource_type>/]<resource_name>
Atributos de estilo de referência
fonte
android.support.v7.appcompat:
.Esta postagem do blog faz um trabalho incrível repassando como referenciar valores para atributos de estilo que são definidos no tema atual: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/
Quando você vê a
?
notação - significa que estamos tentando fazer referência a um atributo de estilo - um valor que pode variar dependendo do tema atual. Em cada tema específico, podemos substituir esse atributo, para que o layout XML não precise ser alterado e o tema correto precise ser aplicado.Quando você vê a
@
notação - referenciamos o valor real do recurso (cor, string, dimensão, etc). Este recurso deve ter um valor real. Nesse caso, sabemos exatamente com qual valor estamos lidando.Aqui está um exemplo:
<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>
fonte