5

カスタム ビューを作成しましたが、それにいくつかのカスタム属性を設定したいと考えています。別のビューの ID を属性として渡したいです。

カスタム ビュー属性:

<?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);、ビューの ID ではなく、0 であることです。

custom:firstName="@id/display_name"<<< ここに何か問題があるはずですが、何が問題なのかわかりません。カスタム属性に整数値を割り当てると機能しますが、Id-s では機能しません。

事前にご協力いただきありがとうございます。

4

2 に答える 2

13

定義を変更<attr name="firstName" format="reference"/> し、コードで使用しますint firstNameViewID = a.getResourceId(attr, -1);

この助けを願っています!

于 2013-08-29T08:29:15.887 に答える
0

使用し、スタイル可能で整数の代わりにcustom:firstName="@+id/display_name"変更します<attr name="firstName" format="refernce"/>

于 2013-08-29T08:17:31.547 に答える