我创建的自定义视图中几乎没有视图。
我想设置一个自定义属性以设置其样式。
我该如何语法化,因为我不是从xml而是动态创建内部视图。
我看到您只能通过代码(而不是通过xml)创建视图时才能通过语法设置样式?
RelativeLayout someLayout = new RelativeLayout(context, null, R.style.LightStyle);
答案 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();
}