2013-08-29 4 views
5

Ho creato la mia visualizzazione personalizzata e desidero impostare alcuni attributi personalizzati. Voglio passare l'id di un'altra vista come attributo.Visualizzazione personalizzata Android con attributi personalizzati

personalizzato Vista attrs:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="IdNumber"> 
     <attr name="firstName" format="integer"/> 
     <attr name="lastName" format="integer"/> 
     <attr name="address" format="integer"/> 
     <attr name="birthDate" format="integer"/> 
    </declare-styleable> 
</resources> 

layout in cui io uso il mio visualizzazione personalizzata:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <EditText 
     android:id="@+id/display_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="text" 
     android:layout_centerHorizontal="true" 
     android:tag="name" 
     android:ems="10" /> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="number" 
     android:ems="10" 
     android:id="@+id/id_number" 
     android:layout_centerHorizontal="true" 
     android:layout_below="@id/display_name"/> 

    <ge.altasoft.custom_views.IdNumber 
     android:id="@+id/custom_id_number" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_below="@id/id_number" 
     android:paddingLeft="35dip" 
     custom:firstName="@id/display_name"/> 


</RelativeLayout> 

costruttore della classe visualizzazione personalizzata, dove voglio ottenere il valore di attributo:

public IdNumber (Context context, AttributeSet attrs) { 
     super(context, attrs); 
     initViews(); 

     TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.IdNumber); 
     final int N = a.getIndexCount(); 
     for(int i = 0; i < N; i++){ 
      int attr = a.getIndex(i); 
      switch(attr){ 
       case R.styleable.IdNumber_firstName: 
        int firstNameViewID = a.getInteger(attr, -1); 
        break; 
      } 
     } 
     a.recycle(); 
    } 

Il problema è che int firstNameViewID = a.getInteger(attr, -1); è solo 0, non l'ID della vista.

custom:firstName="@id/display_name" < < < qui dovrebbe essere qualcosa che non va, ma non so cosa c'è di sbagliato con esso. Quando assegno all'attributo personalizzato qualche valore intero funziona, ma non funziona su Id-s.

Grazie per il vostro aiuto in Advance.

risposta

12

Cambia la tua definiscono <attr name="firstName" format="reference"/> E nel vostro uso del codice int firstNameViewID = a.getResourceId(attr, -1);

Spero che questo aiuto!

+0

Grazie che ha aiutato. – Jilberta

0

uso custom:firstName="@+id/display_name" e nel vostro styleable cambiamento a <attr name="firstName" format="refernce"/> invece di interi

+0

L'ho già usato ma non aiuta. – Jilberta

+0

e mentre ottieni l'ID usa a.getReference() –

+1

grazie per la tua risposta, ma a.getResourceId (attr, -1) ha aiutato. – Jilberta