如何在语法上将样式更改为展开视图

时间:2018-11-09 17:00:55

标签: android layout view styles android-view

我创建的自定义视图中几乎没有视图。

我想设置一个自定义属性以设置其样式。

我该如何语法化,因为我不是从xml而是动态创建内部视图。

我看到您只能通过代码(而不是通过xml)创建视图时才能通过语法设置样式?

RelativeLayout someLayout = new RelativeLayout(context, null, R.style.LightStyle);

https://stackoverflow.com/a/21043373/311130

1 个答案:

答案 0 :(得分:0)

我想提出一些可能的解决方案,但是由于Android的这一部分的设计,它们并不是完全完美的

通过代码配置内部视图

无法将内部TypedArray包装为另一个TypedArray的参数,而且我认为这不是制作AttrbiteSet实例的合理方法(即应该放在代码中)以建立视图。而是只使用不带xml属性的默认构造函数new RelativeLayout(context)并自己提供所有必需的值(您仍然可以在declare-styleable资源中声明自定义属性,以利用基于XML的样式,并将其用作内部样式的一部分视图,但这将是您的“手动”设置)。理由如下:

  • AttributeSet并非旨在用代码构建。检查 文档,您将看到此的唯一实现 界面是XmlResourceParser
  • Android代码本身 即使合理,也不会在代码中构建此参数。 例如,这是的构造函数的代码的第一行 View(Context context)类:

    public View(Context context) {
            mContext = context;
            mResources = context != null ? context.getResources() : null;
            mViewFlags = SOUND_EFFECTS_ENABLED | HAPTIC_FEEDBACK_ENABLED | FOCUSABLE_AUTO;
            ...
            setOverScrollMode(OVER_SCROLL_IF_CONTENT_SCROLLS);
            mUserPaddingStart = UNDEFINED_PADDING;
            mUserPaddingEnd = UNDEFINED_PADDING;
            ...
    }

    如您所见,在任何情况下都不会以编程方式设置Xml属性,而是在代码中设置相应的值。

通过外部布局配置内部视图

您可以创建一个指向外部布局的自定义属性,该属性与您正在使用的内部视图兼容。不幸的是,我不知道是否有一种方法可以限制这种布局的类型,因此您的类的使用者可以提供他想要的任何引用,并且只有您可以在此处执行的操作会抛出运行时异常,以使他知道某些内容是错误。 在您的自定义视图中,可样式化属性声明一个自定义引用属性:

<resources>
    <declare-styleable name="CustomView">
        <attr name="inner_layout" format="reference" />
    </declare-styleable>
</resources>

在您的自定义视图构造函数中,使用检索到的布局ID来填充所需的布局:

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomView, defStyle, 0);

try {
    int resource = a.getResourceId(R.styleable.CustomView_inner_layout, 0);
    RelativeLayout layout = LayoutInflater.from(context).inflate(resource, this, false);
} finally {
    a.recycle();
}