Bisakah seseorang menjelaskan attr?

90

Saya melihat kode contoh Galeri Honeycomb (di sini ) dan saya menemukan kode berikut ketika mencoba menambahkan item tindakan di aplikasi saya sendiri:

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

Itu ?attrmelempar saya untuk satu putaran. Bisakah seseorang menjelaskan apa yang dilakukannya? Bagaimana ini terkait dengan drawable? Sepertinya saya tidak dapat menemukan informasi yang bagus di Google. Juga apakah ada daftar atau galeri atribut yang dapat kita gunakan untuk ikon, bukan hanya menuIconCamera?

Terima kasih

Sunting: Saya melihat-lihat lagi dan menemukan bahwa attrs.xml terlihat seperti ini:

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

Sayangnya itu hanya membuat saya semakin bingung. Apa yang dilakukannya ini?

FuegoFingers
sumber

Jawaban:

65

The ?attr/menuIconCameranilai berarti bahwa ikon dari menuIconCameraatribut tema saat akan digunakan.

Harus ada drawable yang ditetapkan ke menuIconCameraatribut di suatu tempat di themes.xmlfile. Jika ada dua tema dengan nilai yang berbeda dari atribut ini, maka ikon sebenarnya akan bergantung pada tema yang sedang digunakan.

The attrs.xmlfile yang digunakan untuk mendefinisikan atribut khusus. Tanpa definisi ini, kompilator akan memperlakukan atribut yang tidak diketahui sebagai kesalahan.

Michael
sumber
1
Anda benar sekali, <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </item>, Terima kasih banyak. Saya melihat bahwa ic_menu_camera_holo_light adalah drawable lokal. Apakah 3.x tidak memiliki ikon publik bawaan seperti yang dimiliki 2.x?
FuegoFingers
Saya tidak berpikir itu entah bagaimana terhubung ke versi Android. Ini hanyalah cara membuat atribut bergantung pada tema yang dipilih.
Michael
51

The ?attr:sintaks yang digunakan untuk mengakses atribut tema saat ini. Lihat merujuk atribut gaya .

Peter Knego
sumber
3
Tautan yang disediakan sangat, sangat membantu. Terima kasih!
sven
3
Sangat membantu, tetapi Anda tetap harus memposting bagian utama tautan itu.
gustavohenke
1
Ini adalah bagian paling berguna dari artikel tertaut: 'Sumber daya atribut gaya memungkinkan Anda merujuk nilai atribut dalam tema yang saat ini diterapkan. Mereferensikan atribut gaya memungkinkan Anda menyesuaikan tampilan elemen UI dengan menatanya agar sesuai dengan variasi standar yang disediakan oleh tema saat ini, alih-alih memberikan nilai hard-code. Mereferensikan atribut gaya pada dasarnya mengatakan, "gunakan gaya yang ditentukan oleh atribut ini, dalam tema saat ini." '
bigtex777
24

Saya tahu posting ini sudah sangat tua, tetapi saya merasa penjelasan berikut akan membantu pemula untuk memahaminya dengan mudah.

Jadi dalam istilah awam,

someAttribute="?attr/attributeName" berarti -

setel nilai someAttribute ke berapa pun nilai atributName di tema saat ini

Contoh umum terjadi saat menata Toolbar

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

Di sini nilai android:backgroundakan disetel ke @color/primary_colorkarena ?attr/colorPrimarymengacu @color/primary_colorpada tema saat ini (AppTheme)

sziraqui.dll
sumber
17

Bahasa Inggris saya kurang bagus, maaf. Tapi saya tahu pertanyaan ini

android:icon="?attr/menuIconCamera" ingin digunakan

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>

menggunakan @drawable/ic_menu_camera_holo_light

Fajar
sumber
4

Ini untuk merujuk Atribut gaya. lihat R.attr

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

Mereferensikan atribut gaya

Michele
sumber
3
Satu hal yang tampaknya tidak didokumentasikan di mana pun adalah bahwa '<package_name>' adalah nama paket lengkap dari apa pun yang menyatakan sumber daya. Lebih khusus lagi, ini bukan awalan namespace XML, meskipun sintaksnya mungkin menyarankan itu. Misalnya untuk merujuk ke attr yang dideklarasikan oleh pustaka appcompat, gunakan android.support.v7.appcompat:.
Berhenti Merugikan Komunitas
4

Posting blog ini melakukan pekerjaan luar biasa yang membahas cara mereferensikan nilai untuk atribut gaya yang ditentukan dalam tema saat ini: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • Saat Anda melihat ?notasi - artinya kami mencoba mereferensikan atribut gaya - nilai yang dapat bervariasi bergantung pada tema saat ini. Di setiap tema tertentu kita dapat mengganti atribut ini, sehingga tata letak XML tidak perlu diubah, dan tema yang benar perlu diterapkan.

  • Saat Anda melihat @notasi - kami mereferensikan nilai resource sebenarnya (warna, string, dimensi, dll). Sumber daya ini harus memiliki nilai sebenarnya. Dalam hal ini kita tahu persis nilai apa yang kita hadapi.

Berikut contohnya:

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