Android @ layout / list_item未解析为其int值

时间:2015-01-20 12:57:44

标签: android android-custom-attributes

我想创建一个自定义线性布局(作为一些基本列表),它接受来自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");

我得到&#34; @ layout / list_item&#34;。它不会被系统解析为可在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();

    }

}

谢谢!

1 个答案:

答案 0 :(得分: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>);