首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用自定义属性值来膨胀视图?

如何使用自定义属性值来膨胀视图?
EN

Stack Overflow用户
提问于 2018-01-18 04:12:47
回答 1查看 1.1K关注 0票数 0

如何以编程方式设置View中可在onCreate()中使用的值?属性只能在XML中设置,成员值只能在View充气(并且onCreate()已经调用)之后才能设置。

在充气之前,我需要调用View构造函数并设置成员值吗?还是有更好的方法?

EN

回答 1

Stack Overflow用户

发布于 2018-01-18 04:25:25

如果使用Context.getLayoutInflater().createView()膨胀视图,则可以使用最后一个参数以编程方式将自定义属性传递给该视图。

编辑

为了同时使用来自xml的属性和编程属性,您必须实现一个定制的LayoutInflater。然而,因为

您可以看到自定义布局在Android Rec库中的示例。

您可以在此AttributeSet中看到自定义所以回答的示例。

自定义AttriuteSet

如果我将所有这些答案结合起来,您将得到您想要的东西,但是它将需要一些样板代码,因为AttributeSet并不真正适合在动态中添加params。因此,您必须实现AttributeSet (这是一个接口),它在构造函数中获取原始的AttributeSet,并包装其所有功能,并以编程方式返回要添加的参数的正确值。

然后你就可以做这样的事情:

代码语言:javascript
代码运行次数:0
运行
复制
private static class MyLayoutInflater implements LayoutInflater.Factory {

        private LayoutInflater other;

        MyLayoutInflater(LayoutInflater other) {
            this.other = other;
        }

        @Override
        public View onCreateView(String name, Context context, AttributeSet attrs) {
            if (name.equals("MyView")) {
                attrs = MyAttributeSet(attrs);
            }
            try {
                return other.createView(name, "", attrs);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();

            }
        }
    }

    private static class MyAttributeSet implements AttributeSet {

        private AttributeSet other;

        MyAttributeSet(AttributeSet other) {
            this.other = other;
        }

        < More implementations ...>
    }

    @Override
    protected void onCreate(Bundle savedInstanceState){
        getLayoutInflater().setFactory(new MyLayoutInflater(getLayoutInflater());
        getLayoutInflater().inflate(...)
    }

这可能有效,但可能有更好的方法来实现你想要的。

添加自定义参数

您可以实现一个自定义的布局充气器,它将在返回视图之前设置一些参数,因此在视图上调用onCreate之前将添加这些参数。所以会是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
@Override
protected void onCreate(Bundle savedInstanceState){
    getLayoutInflater().setFactory(new LayoutInflater.Factory() {
        public View onCreateView(String name, Context context, AttributeSet attrs) {
            if (name.equals("MyView")) {
                View myView = myView(context, attrs); // To get properties from attrs
                myView.setCustomParams(SomeCustomParam);
                return myView;
            } else {
                return null;
            }
        }
    });
    getLayoutInflater().inflate(...)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48313734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档