具有自定义xml属性的自定义视图:如何引用布局

时间:2013-05-29 11:11:42

标签: android xml android-custom-view

有谁知道,如何以编程方式(在代码中)为我的自定义小部件获取引用的xml布局。我已经创建了一个自定义声明样式,具有我想要的属性,我知道如何获得更好的xml属性值,如字符串或整数。

我想做的是这样的事情:

<MyCustomView
    xmlns:my="http://schemas.android.com/apk/res-auto"
    id="@+id/view"
    my:headerLayout="@layout/my_fancy_layout"
    />

所以我想以编程方式检索my_fancy_layout并在MyCustomView的代码中扩充该布局。

知道怎么做吗?

编辑:我想我可以用

来检索资源ID

int resId = attrs.getAttributeResourceValue(androidns, "headerLayout", 0);

但是,如果MyCustomView是一个库项目并且我想使用

,那么最新的命名空间是什么?
  

的xmlns:我= “http://schemas.android.com/apk/res-auto”

2 个答案:

答案 0 :(得分:0)

您确实可以在自定义视图的构造函数中夸大您的布局:

public class MyCustomView extends /* LinearLayout, RelativeLayout, etc. */ {
    public MyCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context, attrs);
    }
    public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context, attrs);
    }
    protected void initView(Context context, attrs) {
        LayoutInflater.from(context).inflate(attrs.getAttributeResourceValue("http://schemas.android.com/apk/res-auto", "headerLayout", 0), this, true);
    }
}

答案 1 :(得分:0)

好的,我自己找到了解决方案:

你必须从你的AttributeSet中检索一个TypedArray。

您可以使用以下内容访问所需的资源ID:

TypedArray attrs = ... ;
int headerRes = attrs.getResourceId(R.styleable.MyCustomWidget_headerLayout, -1);

比你通常可以充气:

LayoutInflater.from(context).inflate(headerRes, this);