Penso che ci sia solo la seguente differenza tra dichiarare un attributo come stilizzabile o meno.
In attrs.xml è possibile dichiarare gli attributi personalizzati, direttamente all'interno della sezione "risorse" o all'interno di "dichiarare-styleable":
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="attrib1" format="string" />
<declare-styleable name="blahblah">
<attr name="attrib2" format="string" />
</declare-styleable>
Così ora abbiamo definito "attrib1" come non-styleable e " attrib2 "come stilizzabile.
In layout/someactivity.xml
possiamo usare questi attributi direttamente (senza namespace necessario):
<com.custom.ViewClass attrib1="xyz" attrib2="abc"/>
È possibile utilizzare il "styleable" attributo "attrib2" all'interno di una dichiarazione style.xml
. Anche in questo caso, non è necessario alcun namespace (anche se nello spazio XML del layout è stato utilizzato uno spazio dei nomi).
<style name="customstyle" parent="@android:style/Widget.TextView">
<item name="attrib2">text value</item>
<!-- customize other, standard attributes too: -->
<item name="android:textColor">@color/white</item>
</style>
Quindi è anche possibile impostare gli attributi per stile.
<com.custom.CustomView attrib1="xyz" style="@style/customstyle"/>
Supponiamo che facciamo questo: abbiamo impostato attrib1
direttamente in XML, e ci diamo attrib2
in uno stile.
descrizioni Altrove ho visto affermando che "blahblah
" deve essere il nome della classe di visualizzazione personalizzato che utilizza questi attributi, e che è necessario utilizzare uno spazio dei nomi per riferirsi a attributi vostra abitudine in XML layout. Ma niente di tutto ciò sembra necessario.
La differenza tra styleable e non styleable sembra essere che:
- È possibile utilizzare gli attributi styleable in "
style.xml
" dichiarazioni.
- Il costruttore della classe personalizzata deve leggere gli attributi con stile e non in stile in un modo diverso: gli attributi con stile
obtainStyledAttributes()
e gli attributi non stilizzati con attr.getAttributeValue()
o simili.
Nella maggior parte dei tutorial e degli esempi che ho visto sul Web, è stato utilizzato solo lo obtainStyledAttributes()
.Tuttavia, questo non funziona con gli attributi dichiarati direttamente nel layout, senza utilizzare uno stile. Se esegui obtainStyledAttributes()
come mostrato nella maggior parte dei tutorial, non otterrai affatto l'attributo attrib1
; riceverai solo attrib2
da quando è stato dichiarato nello stile. Il metodo diretto utilizzando attr.getAttributeValue()
opere:
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
String attrib1 = attrs.getAttributeValue(null, "attrib1");
// do something with this value
}
dato che abbiamo usato alcun namespace di dichiarare "attrib1
", passiamo null
come argomento namespace in getAttributeValue()
.
risposta formidabile. lo voterei più volte se potessi. –
esattamente quello che il mio problema era, risposta cool –
spiegazione pulita, dritto al punto. – VallaDanger