2013-08-22 25 views
65

Ho creato una vista personalizzata (trovarla here) con un attributo dichiarabile-stilabile di tipo enum. In xml ora posso scegliere una delle voci enum per il mio attributo personalizzato. Ora voglio creare un metodo per impostare questo valore a livello di codice, ma non riesco ad accedere all'enum.Come ottenere un enum che viene creato in attrs.xml nel codice

attr.xml

<declare-styleable name="IconView"> 
    <attr name="icon" format="enum"> 
     <enum name="enum_name_one" value="0"/> 
     .... 
     <enum name="enum_name_n" value="666"/> 
    </attr> 
</declare-styleable>  

layout.xml

<com.xyz.views.IconView 
    android:id="@+id/heart_icon" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:icon="enum_name_x"/> 

Che cosa ho bisogno è qualcosa di simile: mCustomView.setIcon(R.id.enum_name_x); Ma non riesco a trovare l'enum o ho anche non hanno idea come posso ottenere l'enum oi nomi dell'enum.

Grazie

risposta

63

Non sembra essere un modo automatizzato per ottenere un enum Java da un enum attributo - in Java è possibile ottenere il valore numerico specificato - la stringa è per l'uso in file XML (come si mostrare).

Si potrebbe fare questo a suo avviso costruttore:

TypedArray a = context.getTheme().obtainStyledAttributes(
       attrs, 
       R.styleable.IconView, 
       0, 0); 

    // Gets you the 'value' number - 0 or 666 in your example 
    if (a.hasValue(R.styleable.IconView_icon)) { 
     int value = a.getInt(R.styleable.IconView_icon, 0)); 
    } 

    a.recycle(); 
} 

Se si desidera che il valore in un enum si avrebbe bisogno di uno mappare il valore in una Java enum te stesso, ad esempio:

private enum Format { 
    enum_name_one(0), enum_name_n(666); 
    int id; 

    Format(int id) { 
     this.id = id; 
    } 

    static Format fromId(int id) { 
     for (Format f : values()) { 
      if (f.id == id) return f; 
     } 
     throw new IllegalArgumentException(); 
    } 
} 

Poi nel primo blocco di codice è possibile utilizzare:

Format format = Format.fromId(a.getInt(R.styleable.IconView_icon, 0))); 

(anche se un'eccezione a questo p potrebbe non essere una buona idea, probabilmente meglio scegliere un valore predefinito ragionevole)

7

Beh, per l'amor del senno. Assicurati che i tuoi ordinali siano gli stessi nella dichiarazione dichiarata come nella dichiarazione Enum e accedici come una matrice.

+0

Penso che affidarsi agli ordinali enum qui è destinato a creare codice inaffidabile. Una cosa verrà aggiornata e non l'altra, quindi avrai dei problemi. – tir38

2

So che è passato un po 'di tempo da quando la domanda è stata pubblicata, ma ho avuto lo stesso problema di recente. Ho hackerato qualcosa insieme usando JavaPoet di Square e alcune cose nel build.gradle che crea automaticamente una classe enum di Java da attrs.xml sul build del progetto.

C'è un po 'di demo e un readme con una spiegazione a https://github.com/afterecho/create_enum_from_xml

Speranza che aiuta.