2011-09-21 32 views
58

szukam na przykładowy kod Honeycomb Gallery (here) i natknąłem się na następujący kod, starając się dodać elementy działania w moim app:Czy ktoś może wyjaśnić attr?

<item android:id="@+id/camera" 
    android:title="Camera" 
    android:icon="?attr/menuIconCamera" 
    android:showAsAction="ifRoom" /> 

?attr rzuca mnie na pętli. Czy ktoś może wyjaśnić, co to robi? Jak to się ma do losowania? Nie mogę znaleźć żadnych dobrych informacji w Google. Czy istnieje również lista lub galeria atrybutów, których możemy użyć dla ikon zamiast tylko menuIconCamera?

Dzięki

Edit: Zrobiłem kilka rozgląda się i stwierdził, że attrs.xml wygląda następująco:

<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 właśnie czyni go jeszcze bardziej kłopotliwe dla mnie. Co to robi?

Odpowiedz

39

Wartość ?attr/menuIconCamera oznacza, że ​​używana będzie ikona z atrybutu bieżącego motywu o numerze menuIconCamera.

Musi istnieć możliwość losowania przypisanego do atrybutu menuIconCamera gdzieś w pliku themes.xml. Jeśli istnieją dwa motywy o różnych wartościach tego atrybutu, rzeczywista ikona będzie zależała od aktualnie używanego motywu.

Plik attrs.xml służy do definiowania atrybutów niestandardowych. Bez tej definicji kompilator potraktuje nieznane atrybuty jako błędne.

+1

jesteś dokładnie prawo, @ odkształcalne/ic_menu_camera_holo_light, dziękuję tak wiele. Widzę, że ic_menu_camera_holo_light jest lokalnym ciągiem. Czy 3.x nie ma publicznych ikon zbudowanych tak jak w wersji 2.x? – FuegoFingers

+0

Nie sądzę, że jest jakoś połączony z wersją Androida. To tylko sposób na uzależnienie atrybutów od wybranego motywu. – Michael

38

Składnia ?attr: służy do uzyskiwania dostępu do atrybutów bieżącego motywu. Zobacz referencing style attributes.

+3

Podany link był bardzo, bardzo pomocny. Dzięki! – sven

+3

Bardzo pomocne, ale powinieneś nadal publikować główne części tego linku. – gustavohenke

+1

To była najbardziej przydatna część połączonego artykułu: "Zasób atrybutu stylu umożliwia odniesienie wartości atrybutu do aktualnie stosowanej kompozycji. Odwoływanie się do atrybutu stylu umożliwia dostosowanie wyglądu elementów interfejsu użytkownika poprzez stylizowanie ich tak, aby pasowały do ​​standardowych odmian dostarczanych przez bieżący motyw, zamiast dostarczania zakodowanej wartości. Odwoływanie się do atrybutu stylu zasadniczo mówi: "użyj stylu zdefiniowanego przez ten atrybut w bieżącym motywie". " – bigtex777

4

Służy do określania atrybutów stylu. zobacz R.attr

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

Referencing style attributes

+3

Jedną rzeczą, która nie jest nigdzie udokumentowana, jest to, że" "jest pełną nazwą pakietu cokolwiek zadeklarowało zasób. Mówiąc dokładniej, nie jest to prefiks przestrzeni nazw XML, nawet jeśli sugeruje to składnia. Aby na przykład odnieść się do attr zadeklarowanego przez bibliotekę appcompat, użyj 'android.support.v7.appcompat:'. – rockwalrus

13

mój angielski nie jest dobry, przepraszam. Ale wiem, że 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> 

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> 

użycie @drawable/ic_menu_camera_holo_light

+0

Myślę, że jest to najwyraźniejsza odpowiedź. – Clint

9

Znam ten post jest bardzo stary, ale czuję następujące wyjaśnienie pomoże początkującym un łatwo to znieść.

Więc w laika,

someAttribute="?attr/attributeName" oznacza -

ustawić wartość someAttribute do tego, co jest wartością attributeName w aktualnym tematem

Typowym przykładem występuje w stylu paska narzędziowego

<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 dotyczy @color/primary_color w aktualnym tematem (AppTheme)

Powiązane problemy