问题标题可能是荒谬的。我正在创建一组自定义视图,这些视图将放置在单个父布局中 - 自定义FrameLayout
。
这些自定义视图具有自己的样式attr,它们使用父级样式attr设置。
例如,请将Parent
视为自定义FrameLayout
。其样式attr
在attrs.xml
中定义:
<attr name="parentStyleAttr" format="reference" />
Child
也有其attr:
<attr name="childStyleAttr" format="reference" />
Parent
将其可定制的attr定义为:
<declare-styleable name="Parent">
<attr name="childStyleAttr" />
</declare-styleable>
Child's
样式attr:
<declare-styleable name="Child">
<attr name="childBgColor" format="color" />
</declare-styleable>
在此之后,我为父母定义了一种风格:
<style name="ParentStyle">
<item name="childStyleAttr">@style/ChildStyle</item>
</style>
和Child
的一个:
<style name="ChildStyle">
<item name="childBgColor">@color/blah</item>
</style>
对于Parent
,我在应用主题中设置了parentStyleAttr
:
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="parentStyleAttr">@style/ParentStyle</item>
</style>
现在,在创建Parent
时,它会使包含Child
的布局膨胀:
LayoutInflater.from(getContext()).inflate(R.layout.child, this, true);
在Child's
初始化期间,我需要读取@style/ChildStyle
- childBgColor
中设置的样式属性的值。
这不起作用:
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.Child, R.attr.childStyleAttr, R.style.ChildStyle);
我目前正在阅读attr/childBgColor
的方式是:
public Child(Context context, AttributeSet attrs, int defStyleAttr) {
super(createThemeWrapper(context), attrs, defStyleAttr);
initialize(attrs, defStyleAttr, R.style.ChildStyle);
}
private static ContextThemeWrapper createThemeWrapper(Context context) {
final TypedArray forParent = context.obtainStyledAttributes(
new int[]{ R.attr.parentStyleAttr });
int parentStyle = forParent.getResourceId(0, R.style.ParentStyle);
forParent.recycle();
TypedArray forChild = context.obtainStyledAttributes(parentStyle,
new int[]{ R.attr.childStyleAttr });
int childStyleId = forChild.getResourceId(0, R.style.ChildStyle);
forChild.recycle();
return new ContextThemeWrapper(context, childStyleId);
}
void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes) {
Context context = getContext();
final Resources res = getResources();
final TypedArray a = context.obtainStyledAttributes(R.styleable.Child);
....
}
我不相信这是否是正确的做法。有人可以帮忙解释一下吗?