-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!" />

活动主.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 回答