"? Android: attr / enabledBackgroundIndicator" nasıl çalışır?


86

Seçim için bağlamsal bir eylem çubuğu görüntülerken bir listede seçilen bir öğeyi nasıl vurgulayacağımı arıyordum ve bulduğum çözüm, android:backgroundxml satır düzenimin özniteliğini ayarlamaktı "?android:attr/activatedBackgroundIndicator".

Bunu ayarlamak nasıl çalışıyor?

  1. mekanizma nedir?
  2. "?", "attr", "activeBackgroundIndicator" gibi sözdizimi öğeleri ne anlama geliyor?
  3. "ActivatedBackgroundIndicator" ın anlamı nerede tanımlanır?

Yanıtlar:


221

Adli bir ruh halindeyseniz, burada nasıl kazı yapacağınız ve neler olup bittiğini öğreneceğiniz anlatılmaktadır.

android:background="?android:attr/activatedBackgroundIndicator"?

Sezgisel olarak bu, arka planı bazı çekilebilir hale getirmek anlamına gelir.

Ancak gizemli çekilebilirliğe nasıl ulaştığımızı görmek için bunu daha da ayrıştıralım.

Kesin olarak ifade etmek gerekirse, "arka plan özniteliğini" etkinleştirilmiş Arka Plan Göstergesi "özniteliğinin mevcut temada ifade ettiği şeye ayarlayın .

"Mevcut temada atıfta bulunma" bölümünü anlıyorsanız, kapakların arkasında olan her şeyi temelde anlamışsınızdır.

Temel olarak, aktive edilmiş Arka Plan Göstergesi gerçek bir çekilebilir değil, bir çekilebilirliğe referanstır . Peki, "activBackgroundIndictor" özniteliği gerçekte nerede tanımlanıyor?

Sdk dizininizde attrs.xml dosya adıyla tanımlanmıştır . Örneğin:

path_to_android_sdk /latform / android-17 / data / res / values ​​/ attrs.xml

Bu dosyayı açarsanız, beyanı aşağıdaki gibi yapacaksınız:

<attr name="activatedBackgroundIndicator" format="reference" />

attrs.xml, daha sonra xml görünümünüzde kullanacağınız tüm öznitelikleri bildirdiğiniz yerdir. Özniteliği ve türünü bildiriyoruz ve burada aslında bir değer atamıyoruz .

Gerçek değer, themes.xml dosyasında atanır . Bu dosya şu adreste bulunur:

path_to_android_sdk / platformlar / android-17 / data / res / values ​​/ themes.xml

Bu dosyayı açarsanız, kullandığınız temaya bağlı olarak birden çok tanım görürsünüz . Örneğin, sırasıyla Tema, Tema.Işık, Tema.Holo, Tema.Holo.Light temalarının tanımları şunlardır:

<item name="activatedBackgroundIndicator">@android:drawable/activated_background</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_light</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_dark</item>
<item name="activatedBackgroundIndicator">@android:drawable/activated_background_holo_light</item>

Şimdi gizemli çekmecelerimiz var. İlki seçerseniz, şu adresteki çekilebilir klasörde tanımlanır:

path_to_android_sdk / platformlar / android-17 / data / res / drawable / active_background.xml

Bu dosyayı açarsanız, neler olup bittiğini anlamak için önemli olan çekilebilir dosyanın tanımını göreceksiniz.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_activated="true" android:drawable="@android:drawable/list_selector_background_selected" />
    <item android:drawable="@color/transparent" />
</selector>

Burada iki durumlu bir çekilebilir tanımlıyoruz - varsayılan durum sadece şeffaf arka plandır ve eğer durum "state_activated" ise çekilebilirimiz "list_selector_background_selected" olur.

Çekilebilir öğeler ve durumlar hakkında arka plan bilgisi için bu bağlantıya bakın .

"list_selector_background_selected", çekilebilir hdpi klasöründe bulunan 9 yamalı bir png dosyasıdır.

Artık, doğrudan çekilebilir dosyaya bağlanmak yerine, neden activeBackgroundIndicator'ı bir referans olarak tanımladığımızı anlayabilirsiniz - temanıza bağlı olarak doğru çekilebilir olanı seçmenize olanak tanır.


3
Hepsine hükmedecek tek cevap. Yani temelde eğer biri aynı seçicilerle bir XML yapacak olsaydı, kendi "aktive edilmiş Arka Plan Göstergesi" ni yapabilir miydi?
Gee.

1
tam olarak - bunu özel theme.xml dosyanızda yeniden tanımlayabilirsiniz, b / c onun bir referans niteliği.
numan salati

Bu cevap, gezinme çekmecesi listesi öğemde özel bir çekilebilirliği nasıl ayarlayacağımı anlamama yardımcı oldu.
Tastybrownies

Bu, selectorçekmeceleri kullanarak özel işler üzerinde çalışmaya başlamak için harika bir kaynaktır . Bunu okuduktan sonra kalan parçaları doldurmak için Style Attribute Docs kullandım .
Maurizio

1
Bu arka plan göstergesinin nasıl geçersiz kılınacağına dair bir örnek verebilir misiniz? Benimki çalışmıyor: / <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> <item name = "android: enabledBackgroundIndicator"> @ drawable / enabled_background </item> </style> active_background.xml : <seçici xmlns: android = " schemas.android.com/apk/res/android "> <item android: state_activated = "true" android: drawable = "@ color / yellow" /> <item android: drawable = "@ android: color / transparent "/> </selector>
vandus

13

Bunu da bir noktada merak ettim. Android kaynaklarının büyük bir kısmı kara kutu gibi görünüyor ve bunları doğrudan göremiyor. Bunları bir yerde özlüyor olabilirim, ancak SDK kaynak kodunda bulamıyorum. İşte bildiğim şey.

  • android:background bir çekilebilir alacak.
  • Sözdizimi tarzdadır

    "@ [+] [Paket:] tür: ad" biçiminde başka bir kaynağa veya "? [Paket:] [tür:] ad" biçimindeki bir tema özelliğine referans olmalıdır

Bu durumda ?anlamına hangi pakette bir temaya bakmak androidve onu tiptedir attradıdır activatedBackgroundIndicator.

Buna arka planda kodla da erişebilmelisiniz android.R.attr.activatedBackgroundIndicator.

Android attrözelliklerinin bir listesi R.attr adresinde bulunabilir.

  • activatedBackgroundIndicator Android 3.0+ sürümünde tanımlanmış bir çekilebilirdir.

    Çizilebilir, etkin öğeler için arka plan olarak kullanılır.

Temelde sadece işletim sisteminde tanımlanan standart bir öğedir. Android kaynağında bulamıyorum, ancak burada belgelere bir bağlantı var. activeBackgroundIndicator


5

Bu, bir temadan bir değer eklemenin bir biçimidir. Değer, kaynak derleme sırasında teknik olarak bilinmez çünkü tema değerleri o noktada bilinmeyebilir. Bunun yerine değer, (en yaygın olarak) alınan gerçek temaya göre çalışma zamanında çözülür ContextThemeWrapper.

Bu, kaynak değerlerini yeniden kullanmanın bir yolunu sağlar. Burada performans açısından değil, daha çok organizasyon ve bakım açısından konuşuyorum. Özellik, çalışma zamanında gerçek bir değeri tutacağı vaadiyle bir değişkenmiş gibi davranır.

Bu yaklaşım aynı zamanda daha fazla kişiselleştirmeye de izin verir - örneğin, pencere arka planı çizilebilir değerini kodlamak yerine, bir temadan gerçek çekilebilir olanı alır ve anahtar olarak seçilen bir özniteliği sağlar. Bu olanak Eğer bu özellik için değer geçersiz kılar. Yapmanız gereken tek şey:

  1. En çok varsayılan temalardan birinden türetilen kendi temanızı ("stil" kaynağı için süslü bir addır) oluşturun.
  2. Söz konusu özellik için kendi değerinizi sağlayın.

Bir etkinlik veya uygulama için temanızı belirlemeniz koşuluyla platform, değerinizi otomatik olarak kullanacaktır. Bunu soruda anlatıldığı gibi yaparsınız. Tema öznitelik referanslarının genel sözdizimi burada açıklanmıştır: Stil özniteliklerine başvurma . Ayrıca burada tüm mekanizmanın bir örneğini ve açıklamasını bulacaksınız.

Düzenle

Dikkat edilmesi gereken bir şey, gerçek öznitelik adları ve bunların çeşitli platform sürümlerindeki varlıklarıdır. Yeni özniteliklerin sonraki platform sürümlerinde tanıtılması oldukça yaygındır - örneğin bazıları ActionBar stili amacıyla sürüm 3.0'a eklenmiştir.

Öznitelik adlarını API'nin bir parçası olarak ele almalısınız - başka bir deyişle, bunlar, kullanmanıza izin verilen sözleşmenin bir parçasıdır. Bu, sınıflara ve onların imzalarına çok benzer - LocationManagerson aygıt konumunu elde etmek için sınıfı kullanırsınız çünkü bazı kaynaklardan (öğreticiler, referanslar, resmi kılavuzlar, vb.) Bu sınıfın amacının ne olduğunu biliyorsunuz . Benzer şekilde, özellik adları ve amaçları (bazen iyi, bazen kötü bir şekilde) Android Platform belgelerinde tanımlanmıştır.


2

Güncelleme: API Kılavuzunda daha ayrıntılı bir sürüm mevcut, bu yüzden alıntı yapmak istiyorum.

Bir stil özniteliği kaynağı, o anda uygulanan temadaki bir özniteliğin değerine başvurmanıza olanak tanır. Bir stil özniteliğine başvurmak, sabit kodlanmış bir değer sağlamak yerine, UI öğelerinin görünümünü geçerli tema tarafından sağlanan standart varyasyonlarla eşleşecek şekilde şekillendirerek özelleştirmenize olanak tanır. Bir stil özelliğine atıfta bulunulduğunda, esasen "mevcut temada bu özellik tarafından tanımlanan stili kullan" der.

Bir stil özniteliğine başvurmak için ad sözdizimi normal kaynak biçimiyle hemen hemen aynıdır, ancak at-simgesi (@) yerine bir soru işareti (?) Kullanın ve kaynak türü kısmı isteğe bağlıdır. Örneğin:

Orijinal Cevap:

numan salati zaten mükemmel bir cevap verdi ama "?" sözdizimi. İşte Kaynaklara Erişim API Kılavuzundan bir alıntı

Bir stil özniteliğine başvurmak için ad sözdizimi normal kaynak biçimiyle hemen hemen aynıdır, ancak at-simgesi (@) yerine bir soru işareti (?) Kullanın ve kaynak türü kısmı isteğe bağlıdır. Örneğin:

? [<paket_adı>:] [<kaynak_türü> /] <kaynak_adı>

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.