2013-08-29 45 views
5

我已经创建了自定义视图,并且我想为其设置一些自定义属性。我想传递另一个视图的id作为属性。具有自定义属性的Android自定义视图

自定义视图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> 

布局,其中我用我的自定义视图:

<?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> 

自定义视图类的构造函数,在这里我想要得到的属性值:

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(); 
    } 

问题是int firstNameViewID = a.getInteger(attr, -1);只是0,而不是视图的ID。

custom:firstName="@id/display_name" < < <这里应该是错的,但我不知道它有什么问题。当我为自定义属性分配一些整数值时,它可以工作,但它不适用于Id-s。

感谢您的帮助。

回答

12

更改定义<attr name="firstName" format="reference"/> 并在代码中使用int firstNameViewID = a.getResourceId(attr, -1);

希望这有助于!

+0

谢谢,帮助。 – Jilberta

0

使用custom:firstName="@+id/display_name"和您的设置样式将其更改为<attr name="firstName" format="refernce"/>,而不是整数

+0

我已经使用它,但它没有帮助。 – Jilberta

+0

虽然创建id使用a.getReference() –

+1

感谢您的答案,但a.getResourceId(attr,-1)帮助。 – Jilberta