如何从LinearLayout自己的样式设置LinearLayout的子视图样式?

时间:2016-03-01 19:15:11

标签: android android-layout

对不起可能令人困惑的标题

所以我正在使用ViewPagerIndicator,这是一个在TabLayout 5.0发布之前常用于制表符的库。在此库中,选项卡是扩展TextView的视图,它接受样式化的自定义属性。

//An inner class of TabPageLayout
private class TabView extends TextView {
    private int mIndex;

    public TabView(Context context) {
        super(context, null, R.attr.vpiTabPageIndicatorStyle); //<--custom attribute
    }
    // ...
}

vpi__attrs.xml

<resources>
    <declare-styleable name="ViewPagerIndicator">
        ...
        <!-- Style of the tab indicator's tabs. -->
        <attr name="vpiTabPageIndicatorStyle" format="reference"/>
    </declare-styleable>
    ...

使用此设置,当我在自己的项目中使用TabPageLayout时,我可以像这样定义文本的样式

<!--This is styles.xml of my project -->
<style name="MyStyle.Tabs" parent="MyStyle" >
        <item name="vpiTabPageIndicatorStyle">@style/CustomTabPageIndicator</item>

    </style>

    <style name="CustomTabPageIndicator">
        <item name="android:gravity">center</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textSize">@dimen/secondary_text_size</item>
         ...
    </style>

以下样式将应用于Activity,它将覆盖ViewPagerIndicator库中的默认vpiTabPageIndicator。

我现在的问题是我需要对TabView进行比TextView允许的更多自定义,所以我创建了一个名为“TabLayoutWithIcon”的新内部类,它扩展了LinearLayout并包含了TextView。

private class TabViewWithIcon extends LinearLayout {
    private int mIndex;
    private TextView mText;

    public TabViewWithIcon(Context context) {
        super(context, null, R.attr.vpiTabPageIndicatorStyle);
        //setBackgroundResource(R.drawable.vpi__tab_indicator);
        mText = new TextView(context);
    }
    ...

    public void setText(CharSequence text){
        mText.setText(Integer.toString(mIndex) + " tab");
        addView(mText);
    }

    public void setImage(int iconResId){
        mText.setCompoundDrawablesWithIntrinsicBounds(iconResId, 0, 0, 0);
        mText.setCompoundDrawablePadding(8); //Just temporary
    }

现在,相同的自定义样式应用于LinearLayout,但我也希望为子TextView设置样式。我怎么能这样做?

当然,我也可以在TabViewWithIcon中以编程方式传递TextView的样式,如

       mText.setTextAppearance(context, R.style.CustomTabTextStyle);

但是我必须在库中编写我的自定义样式,我不应该这样做。

我是否需要重新定义某些属性或其他内容?我接近这个错误吗?

1 个答案:

答案 0 :(得分:1)

我是个白痴,我只是将自定义TextView样式传递给TextView

    public TabView(Context context) {
        super(context, null, R.attr.vpiTabPageIndicatorStyle);
        //setBackgroundResource(R.drawable.vpi__tab_indicator);
        mText = new TextView(context, null, R.attr.vpiTabPageIndicatorStyle);
    }