Patrzę na przykładowy kod Honeycomb Gallery ( tutaj ) i natknąłem się na następujący kod, próbując dodać elementy akcji w mojej własnej aplikacji:
<item android:id="@+id/camera"
android:title="Camera"
android:icon="?attr/menuIconCamera"
android:showAsAction="ifRoom" />
To ?attr
rzuca mi pętlę. Czy ktoś może wyjaśnić, co to robi? Jak to się ma do rysowania? Nie mogę znaleźć żadnych dobrych informacji w Google. Czy jest też lista lub galeria atrybutów, których możemy użyć dla ikon zamiast tylko menuIconCamera
?
Dzięki
Edycja: rozejrzałem się trochę i stwierdziłem, że attrs.xml wygląda tak:
<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>
Niestety to tylko sprawia, że jest to dla mnie jeszcze bardziej zagmatwane. Co to robi?
źródło
?attr:
Składnia służy do uzyskiwania dostępu do atrybutów aktualnego tematu. Zobacz odwołania do atrybutów stylu .źródło
Wiem, że ten post jest bardzo stary, ale uważam, że poniższe wyjaśnienie pomoże początkującym łatwo go zrozumieć.
Więc mówiąc językiem laika,
someAttribute="?attr/attributeName"
znaczy -Typowy przykład występuje w stylizowaniu paska narzędzi
<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>
Tutaj wartość
android:background
zostanie ustawiona na,@color/primary_color
ponieważ?attr/colorPrimary
odwołuje się do@color/primary_color
bieżącego motywu (AppTheme)źródło
Mój angielski nie jest dobry, przepraszam. Ale znam to pytanie
android:icon="?attr/menuIconCamera"
chcesz użyć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>
style.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>
posługiwać się
@drawable/ic_menu_camera_holo_light
źródło
Służy do odwoływania się do atrybutów stylu. patrz R.attr
?[<package_name>:][<resource_type>/]<resource_name>
Odwołania do atrybutów stylu
źródło
android.support.v7.appcompat:
.Ten post na blogu wykonuje niesamowitą robotę, omawiając sposoby odwoływania się do wartości atrybutów stylu zdefiniowanych w bieżącym motywie: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/
Kiedy widzisz
?
notację - oznacza to, że próbujemy odwołać się do atrybutu stylu - wartości, która może się różnić w zależności od aktualnego motywu. W każdym konkretnym motywie możemy nadpisać ten atrybut, więc nie trzeba zmieniać układu XML i zastosować właściwy motyw.Kiedy widzisz
@
notację - odnosimy się do rzeczywistej wartości zasobu (kolor, ciąg, wymiar itp.). Ten zasób powinien mieć rzeczywistą wartość. W tym przypadku dokładnie wiemy, z jaką wartością mamy do czynienia.Oto przykład:
<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>
źródło