2011-01-03 19 views
20

Ho iniziato a giocare con gli stili e così via nelle mie applicazioni Android, e ho ottenuto tutto ciò che ha funzionato finora. Ho capito perfettamente lo 'stile' section of the guide.Differenza tra stile dichiarabile e stile

Ma, guardando in giro, come in this thread, non riesco a capire la differenza tra i due (declare-stylable e style). Dalla mia comprensione declare-styleable prende l'attributo specificato in esso e lo specifica come modificabile, e quindi dal codice uno lo cambia come vuole.

Ma se questo è ciò che realmente fa, non sarebbe più semplice definire l'attributo nel layout? Oppure dichiarare uno stile specificandolo?

risposta

52

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().

+0

risposta formidabile. lo voterei più volte se potessi. –

+0

esattamente quello che il mio problema era, risposta cool –

+0

spiegazione pulita, dritto al punto. – VallaDanger

2

Controllare questo thread.

Senza lo declare-styleable non sarebbe possibile creare un nuovo stato disegnabile personalizzato.

+0

Quindi la differenza è che declare-styleable ti dà la possibilità di introdurre nuovi attributi con cui puoi fare magie come gli stati del disegno (credo ci debbano esserci altri usi) e lo stile semplicemente raggruppa un insieme di attributi già esistente? Ha senso, grazie. – Stephan

Problemi correlati