Czy ktoś może wyjaśnić atr?

89

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

FuegoFingers
źródło

Odpowiedzi:

64

Te ?attr/menuIconCameraśrodki, które wartości z ikoną menuIconCamerazostaną wykorzystane atrybutu bieżącego tematu.

menuIconCameraGdzieś w themes.xmlpliku musi istnieć możliwość rysowania przypisana do atrybutu . Jeśli istnieją dwa motywy z różnymi wartościami tego atrybutu, rzeczywista ikona będzie zależeć od motywu, który jest obecnie używany.

attrs.xmlPlik jest używany do zdefiniowania atrybutów niestandardowych. Bez tej definicji kompilator będzie traktował nieznane atrybuty jako błędne.

Michał
źródło
1
masz dokładnie rację, <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </item>, dziękuję bardzo. Widzę, że ic_menu_camera_holo_light jest lokalnym rysunkiem. Czy 3.x nie ma wbudowanych ikon publicznych, jak w przypadku 2.x?
FuegoFingers
Nie sądzę, że jest w jakiś sposób połączony z wersją Androida. To tylko sposób na uzależnienie atrybutów od wybranego tematu.
Michael,
51

?attr:Składnia służy do uzyskiwania dostępu do atrybutów aktualnego tematu. Zobacz odwołania do atrybutów stylu .

Peter Knego
źródło
3
Podany link był bardzo, bardzo pomocny. Dzięki!
sven
3
Bardzo pomocne, ale nadal powinieneś publikować główne części tego linku.
gustavohenke
1
To była najbardziej pomocna część połączonego artykułu: „Zasób atrybutu stylu umożliwia odniesienie się do wartości atrybutu w aktualnie stosowanym motywie. Odwołanie do atrybutu stylu umożliwia dostosowanie wyglądu elementów interfejsu użytkownika przez nadanie im stylu zgodnego ze standardowymi odmianami dostarczanymi przez bieżący motyw, zamiast dostarczania wartości zakodowanej na stałe. Odwołanie do atrybutu stylu zasadniczo mówi: „użyj stylu zdefiniowanego przez ten atrybut w bieżącym motywie”. '
bigtex777,
24

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 -

ustaw wartość someAttribute na dowolną wartość parametru attributeName w bieżącym motywie

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:backgroundzostanie ustawiona na, @color/primary_colorponieważ ?attr/colorPrimaryodwołuje się do @color/primary_colorbieżącego motywu (AppTheme)

sziraqui
źródło
16

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

świt
źródło
4

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

Michele
źródło
3
Jedyną rzeczą, która wydaje się nie być nigdzie udokumentowana, jest to, że „<nazwa_pakietu>” to pełna nazwa pakietu dowolnego zadeklarowanego zasobu. Mówiąc dokładniej, nie jest to przedrostek przestrzeni nazw XML, mimo że składnia może to sugerować. Na przykład, aby odnieść się do atrybutu zadeklarowanego przez bibliotekę appcompat, użyj android.support.v7.appcompat:.
Przestań szkodzić społeczności
4

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>
nazmul idris
źródło