1

有人知道,如何以编程方式(在代码中)为我的自定义小部件获取引用的 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 的代码中扩展该布局。

知道怎么做吗?

编辑:我想我可以用

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

但是,如果我 MyCustomView 是一个库项目并且我想使用,那么正确的命名空间是什么

xmlns:my="http://schemas.android.com/apk/res-auto"

4

2 回答 2

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);
    }
}
于 2013-05-29T11:26:55.810 回答
0

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

您必须从您的 AttributeSet 中检索 TypedArray。

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

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

比你通常可以膨胀的:

LayoutInflater.from(context).inflate(headerRes, this);
于 2013-05-29T12:21:16.457 回答