Birisi attr'ı açıklayabilir mi?


90

Honeycomb Gallery örnek koduna bakıyorum ( burada ) ve kendi uygulamamda eylem öğeleri eklemeye çalışırken aşağıdaki kodla karşılaştım:

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

?attrBeni alt atıyor. Lütfen birisi bunun ne yaptığını açıklayabilir mi? Bu bir çekilebilirlikle nasıl ilişkilidir? Google'da iyi bir bilgi bulamıyorum. Ayrıca simgeler için kullanabileceğimiz niteliklerin bir listesi veya galerisi var menuIconCameramı?

Teşekkürler

Düzenleme: Etrafa biraz daha baktım ve attrs.xml dosyasının şuna benzediğini gördüm:

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

Ne yazık ki bu benim için daha da kafa karıştırıcı hale getiriyor. Bu ne yapıyor?

Yanıtlar:


65

?attr/menuIconCameraBir simge değeri aracı menuIconCamerageçerli temanın özniteliği kullanılacaktır.

Dosyanın menuIconCameraherhangi bir yerinde özniteliğe atanmış bir çekilebilir themes.xmldosya bulunmalıdır . Bu özniteliğin farklı değerlerine sahip iki tema varsa, gerçek simge, şu anda kullanılan bir temaya bağlı olacaktır.

attrs.xmlDosya özel özellikler tanımlamak için kullanılır. Bu tanım olmadan derleyici bilinmeyen öznitelikleri hatalı olarak değerlendirecektir.


1
tam olarak haklısınız <item name = "menuIconCamera"> @ drawable / ic_menu_camera_holo_light </item>, Çok teşekkür ederim. İc_menu_camera_holo_light'ın yerel bir çekilebilir olduğunu görüyorum. 3.x'in 2.x'in sahip olduğu gibi yerleşik simgeleri yok mu?
FuegoFingers

Android sürümüne bir şekilde bağlı olduğunu sanmıyorum. Bu, nitelikleri seçilen bir temaya bağımlı hale getirmenin bir yoludur.
Michael

51

?attr:Sözdizimi geçerli temanın özellikleri değiştirmek için kullanılır. Stil niteliklerine referans verme konusuna bakın .


3
Sağlanan bağlantı çok çok yardımcı oldu. Teşekkürler!
sven

3
Çok yardımcı oldu, ancak yine de bu bağlantının ana bölümlerini göndermelisiniz.
gustavohenke

1
Bu, bağlantılı makalenin en yararlı kısmıydı: 'Bir stil özniteliği kaynağı, şu anda uygulanan temadaki bir özniteliğin değerine başvurmanıza olanak tanır. Bir stil niteliğine başvurmak, sabit kodlanmış bir değer sağlamak yerine, UI öğelerinin görünümünü mevcut tema tarafından sağlanan standart varyasyonlarla eşleşecek şekilde şekillendirerek özelleştirmenize olanak tanır. Bir stil özniteliğine atıfta bulunmak, esasen "bu öznitelik tarafından tanımlanan stili mevcut temada kullanın" der.
bigtex777

24

Bu yazının çok eski olduğunu biliyorum, ancak aşağıdaki açıklamanın yeni başlayanların kolayca anlamasına yardımcı olacağını düşünüyorum.

Yani meslekten olmayanların terimleriyle,

someAttribute="?attr/attributeName" anlamına geliyor -

someAttribute değerini, geçerli temadaki attributeName değeri ne olursa olsun ayarlayın

Araç Çubuğu stilini oluştururken yaygın bir örnek

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

İşte değeri android:backgroundayarlanır @color/primary_colorNEDENİYLE ?attr/colorPrimaryifade eder @color/primary_color(AppTheme) geçerli tema


17

İngilizcem iyi değil, üzgünüm. Ama bu soruyu biliyorum

android:icon="?attr/menuIconCamera" kullanmak istemek

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>

kullanım @drawable/ic_menu_camera_holo_light


4

Bu, stil Özelliklerine atıfta bulunmak içindir. bkz. R.attr

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

Stil niteliklerine başvurma


3
Herhangi bir yerde belgelenmemiş gibi görünen bir şey, '<paket_adı>' nın kaynağı bildiren her şeyin tam paket adı olmasıdır. Daha spesifik olarak, sözdizimi bunu önerse de, bu bir XML ad alanı öneki değildir. Örneğin, appcompat kitaplığı tarafından bildirilen bir attr'a başvurmak için kullanın android.support.v7.appcompat:.
Topluluğa Zarar Vermeyi Durdur

4

Bu blog gönderisi, mevcut temada tanımlanan stil nitelikleri için değerlere nasıl referans verileceğini gözden geçiren harika bir iş çıkarıyor: https://trickyandroid.com/android-resources-and-style-attributes-cheatsheet/

  • ?Gösterimi gördüğünüzde - bu, bir stil niteliğine başvurmaya çalıştığımız anlamına gelir - mevcut temaya bağlı olarak değişebilen bir değer. Her bir özel temada bu niteliği geçersiz kılabiliriz, böylece XML düzeninin değiştirilmesi gerekmez ve doğru temanın uygulanması gerekir.

  • @Gösterimi gördüğünüzde - gerçek kaynak değerine (renk, dize, boyut, vb.) Başvuruyoruz. Bu kaynak gerçek bir değere sahip olmalıdır. Bu durumda hangi değerle uğraştığımızı tam olarak biliyoruz.

İşte bir örnek:

    <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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.