Styles.xml dosyasındaki özel özellikler


178

Özel bir widget oluşturdum ve layout.xml dosyasında bildiriyorum. Ayrıca attr.xml dosyasında bazı özel özellikler ekledim. Ancak, bu nitelikleri styles.xml dosyasında bir stilde bildirmeye çalışırken,No resource found that matches the given name: attr 'custom:attribute'.

Ben koyduk xmlns:custom="http://schemas.android.com/apk/res/com.my.package"dahil styles.xml etiketleri, tüm <?xml>, <resources>ve <style>, ama yine de benim özel XML ad bulamıyorum ki bana aynı hata veriyor.

Ancak, benim layout.xml görünümüne el ile öznitelikleri atamak için ad alanımı kullanabilirsiniz, bu nedenle ad alanında yanlış bir şey yok. Benim sorunum styles.xml dosyasını attr.xml'imden haberdar etmede yatıyor.


1
cutsom:xmlns=...?? olmamalı xmlns:cutsom=...mı?
Selvin

Evet, yine de kopyala / yapıştır kullanmamaya
çalıştığım için

Yanıtlar:


362

Bunu anladım! Cevap etmektir DEĞİL tarzında ad belirtin.

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="CustomStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>

        <item name="custom_attr">value</item> <!-- tee hee -->
    </style>
</resources>

13
Hata kaybolur, ancak benim görüşüm öznitelik değerini kabul etmezken, diğer (özel olmayan) öznitelikleri benimser. Benim özel özelliğim bir enum. Yukarıdaki pasaj sizin için çalışıyor mu?
Paul Lammertsma

@PaulLammertsma Bir numaralandırma kullanıyorum ve bu benim için de işe yaramıyor. Özel ad alanı xmlns özniteliğine sahip değilseniz, aslında öğe adı özniteliği için istediğiniz herhangi bir değeri yazabilirsiniz ve derlenir.
David Snabel-Caunt

@DavidCaunt Sonunda çalıştığım şey üzerinde çalıştım aldım . Sonunda declare-stylablebir numaralandırma yerine bir dize kullandım . Numaralandırmaların neden çalışmadığından emin değilim, ancak bu çözüm benim için yeterince iyiydi.
Paul Lammertsma

3
API lvl 16 kullanarak bu benim için bile
derlenmiyor

3
Bu çalışırken, aynı ada sahip bir öznitelik iki veya daha fazla pakette ancak farklı paket adlarında mevcutsa özniteliklerin çözümlenmesinde bir sorun olabileceğinden şüpheleniyorum.
AndroidDev

43

Yukarıdaki cevap benim için çalıştı, litte bir değişiklik denedim, kaynaklar öğesinde bir sınıf için stilize ilan ediyorum.

<declare-styleable name="VerticalView">
    <attr name="textSize" format="dimension" />
    <attr name="textColor" format="color" />
    <attr name="textBold" format="boolean" />
</declare-styleable>

içinde beyan-styleable , adı bir görünüm sınıfı çağrısı "com.my.package.name.VerticalView" vardı niteliği, bir sınıf adı başvurulan, bu beyan VerticalView veya VerticalView sınıfının alt kullanım olmalıdır temsil etti. böylece tarzı şöyle ilan edebiliriz:

<resources>
    <style name="verticalViewStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">36dip</item>

        <item name="textSize">28sp</item>  <!-- not namespace prefix -->
        <item name="textColor">#ff666666</item>
        <item name="textBold">true</item>
    </style>
</resources>

bu yüzden kaynak alanında ad alanı beyan etmedik, hala çalışıyor.


11

değerler / styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="defaultButtonColor">@color/red</item>
    <item name="defaultButtonHeight">@dimen/dp_100</item>
</style>

değerler / attrs.xml

<resources>
    <attr name="defaultButtonColor" format="reference" />
    <attr name="defaultButtonHeight" format="reference"/>
</resources>

değerler / colors.xml

<resources>
    <color name="red">#f00</color>
</resources>

değerler / dimens.xml

<resources>
    <dimen name="dp_100">100dp</dimen>
</resources>

kullanma

<Button
    android:layout_width="wrap_content"
    android:layout_height="?attr/defaultButtonHeight"
    android:text="Button"
    android:textColor="?attr/defaultButtonColor"
    />

resim açıklamasını buraya girin

DEMO


10

Styler ve vince'nin modifikasyonu benim için çalıştı. @ Vince'nin açıklamasının tamamen doğru olmayabileceğini belirtmek istedim.

declare-styleableÖzel görünüm sınıfının adıyla eşleşen ad özniteliğinin bir ad alanı olmadan özel özniteliğe erişmemize izin verdiği hipotezini test etmek için adını değiştirdim declare-styleable(özel görünüm adlandırıldı TestViewFont:

<declare-styleable name="TextViewFont2">
    <attr name="font" format="integer"/>
</declare-styleable>

Daha sonra obtainStyledAttributesbunu yansıtacak şekilde özel görünümdeki çağrıyı değiştirdim :

TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.TextViewFont2, 0, 0);

Kod hala çalýţmýţ. Bu yüzden declare-styleableadı verilen sınıfın bir tür içgözlem olduğunu düşünmüyorum .

Bu nedenle, herhangi bir özel özelliğin, bir ad alanına başvurmadan bir stil bildirmek için kullanılabileceğine inanıyorum.

Ne olursa olsun, tüm yardımcılar için teşekkürler, sorunumu çözdü.


Aslında, öznitelikler bir declare-styleableblokta bildirilmiş olsun ya da olmasın aynı ad alanını paylaşır . (özür dilerim, bunun için referans sayfasını bulamıyorum…) androidAd alanındaki öznitelikler dışında yalnızca öznitelik adını belirtmelisiniz.
pr-shadoko

3
  • Bazı özellikleri tanımlayın

<declare-styleable name="refreshPullRefreshLayout">
        <attr name="refreshColors" format="reference"/>
        <attr name="refreshColor" format="reference"/>
</declare-styleable>
  • Gibi düzen dosyasında kullanın

<com.aolphn.PullRefreshLayout
     app:refreshColor="@color/main_green"
     app:refreshColors="@array/refresh_color"/>
  • Sonunda stil dosyasında kullanın

    Stil dosyası ve düzen dosyası arasındaki fark, prefiex eklemememizdir app:
<style name="refreshStyle">
    <item name="refreshColor">@color/main_green</item>
    <item name="refreshColors">@array/refresh_color</item>
</style>

Deneyin, iyi günler, bu benim için çalışıyor.


2

Başka birine yardımcı olması durumunda, benim hatam özel görünüm sınıfım AttributeSet.getAttributeValue örneğin

String fontName = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto", "customFont");

... bu da özel özelliğimin özel görünümüm için okunmamasına neden oldu.

Düzeltme obtainStyledAttributesbenim özel görünümümde kullanmaktı :

 TypedArray styleAttrs = context.obtainStyledAttributes(attrs, R.styleable.MyTextViewStyleable);
 String fontName = styleAttrs.getString(R.styleable.MyTextViewStyleable_customFont);

Bunun doğru çalıştığına dair bir ipucu, R.styleable.MyTextViewStyleable_customFontdoğrudan attrs.xml tanımınıza almak için Ctrl / Apple + 'ı tıklamanızdır .

Özel öznitelik doğrudan düzen XML'sinden (stil yerine) aktarıldığında iyi çalıştığından, kodum ve diğer örnekler arasındaki bu kritik farkı tespit etmem biraz zaman aldı.

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.