-1

次のように、xml からカスタム パラメーターを受け入れるカスタム リニア レイアウト (いくつかの基本的なリストとして機能する) を作成したいと思います。

<MyLinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
myns:layout_to_inflate="@layout/list_item"/>

次に、コンストラクターで使用します。

String layoutToInflate = attrs.getAttributeValue(NAMESPACE, "layout_to_inflate");

「@layout/list_item」を取得します。システムによって、R.layout.list_item でアクセス可能な int 値に解決されません。

確かにそれを解析し、Resources.getIdentifier を使用して ID を検索し、それを膨らませることはできますが、それは方法ではないと思います。

では・・・その方法は?システムに int に直接解決させることはできますか?

アップデート:

list_item.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Text here!" />

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myns="http://com.example.layoutinflate"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

    <com.example.layoutinflate.MyLinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    myns:layout_to_inflate="@layout/list_item" />


</RelativeLayout>

内容 MyLinearLayout.java:

public class MyLinearLayout extends LinearLayout {

    private static final String TAG = MyLinearLayout.class.getSimpleName();

    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.MyLinearLayout);

        int layoutId = styledAttributes.getResourceId(R.styleable.MyLinearLayout_layout_to_inflate, -1);
        int layoutIdInt = styledAttributes.getInt(R.styleable.MyLinearLayout_layout_to_inflate, -1);
        String str = styledAttributes.getString(R.styleable.MyLinearLayout_layout_to_inflate);

        Log.d(TAG, Integer.toString(layoutId) + ";" + str + ";" + layoutIdInt); //-1; null; -1

        styledAttributes.recycle();

    }

}

ありがとう!

4

1 に答える 1

0

内でこのカスタム属性を正しく定義していることを確認してくださいattrs.xml。次のようにする必要があります。

<attr name="layout_to_inflate" format="reference" />
<declare-styleable name="MyLinearLayout">
    <attr name="layout_to_inflate" />
</declare-styleable>

MyLinearLayout次に、これを使用してオブジェクト内でこの値を取得できます。

int layoutToInflateId = attributes.getResourceId(R.styleable.MyLinearLayout_layout_to_inflate, R.layout.<default_layout_to_inflate>);
于 2015-01-20T13:07:48.790 に答える