从父级样式定义中获取子级的样式属性

时间:2015-05-09 19:20:55

标签: android xml attr

问题标题可能是荒谬的。我正在创建一组自定义视图,这些视图将放置在单个父布局中 - 自定义FrameLayout

这些自定义视图具有自己的样式attr,它们使用父级样式attr设置。

例如,请将Parent视为自定义FrameLayout。其样式attrattrs.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);

    ....
}

我不相信这是否是正确的做法。有人可以帮忙解释一下吗?

1 个答案:

答案 0 :(得分:1)

我会选择一个简单的解决方案来扩展布局并创建一个自定义布局,将其属性发送给它的孩子while adding them