动态更改操作栏分隔颜色(android:bottom用于以编程方式生成的ShapeDrawable)?

时间:2013-06-27 18:59:43

标签: android actionbarsherlock android-actionbar shapedrawable

我正在尝试以编程方式更改操作栏底部的分隔栏颜色。我的策略是根据this XML将操作栏背景设置为以编程方式生成的包含LayerDrawable矩形的ShapeDrawable

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Bottom Line -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/action_bar_line_color" />
        </shape>
    </item>

    <!-- Color of your action bar -->
    <item android:bottom="2dip">
        <shape android:shape="rectangle">
            <solid android:color="@color/action_bar_color" />
        </shape>
    </item>
</layer-list>

但是我遇到了障碍:我无法弄清楚如何以编程方式应用android:bottom属性(如<item android:bottom="2dip">)。显然android:bottom是item标签的属性,我认为没有编程等价物,我无法找到ShapeDrawable看起来合适的任何方法/属性。

到目前为止

代码:

public LayerDrawable createABBackground(String color) {
    ShapeDrawable rect = new ShapeDrawable(new RectShape());
    rect.getPaint().setColor(Color.parseColor("#000000"));
    ShapeDrawable rect2 = new ShapeDrawable(new RectShape());
    rect2.getPaint().setColor(Color.parseColor(color));
    ShapeDrawable[] layers = {rect, rect2};
    LayerDrawable background = new LayerDrawable(layers);
    return background;
}

想法?如果它对替代解决方案很重要,我正在使用ActionBarSherlock。

编辑:

按照MH的建议,

setLayerInset做了我想要的。这是使用它的函数的修改版本:

public LayerDrawable createABBackground(String color) {
    ShapeDrawable rect = new ShapeDrawable(new RectShape());
    rect.getPaint().setColor(Color.parseColor(color));
    ShapeDrawable rect2 = new ShapeDrawable(new RectShape());
    rect2.getPaint().setColor(Color.parseColor("#000000"));
    ShapeDrawable[] layers = {rect, rect2};
    LayerDrawable background = new LayerDrawable(layers);
    background.setLayerInset(0, 0, 3, 0, 0);
    background.setLayerInset(1, 0, 0, 0, 3);
    return background;
}

4 个答案:

答案 0 :(得分:3)

根据之前的评论:

你试过setLayerInset(int index, int l, int t, int r, int b)了吗?文档说:

  

为drawable [index]的边界指定修改器。左+ = l顶部   + = t;对 - = r; bottom - = b;

答案 1 :(得分:1)

通过source code判断LayerDrawable,允许你这样做的方法是私有的。但是你可以通过一个持有InsetDrawable

的LayerDrawable来实现这一目标

答案 2 :(得分:0)

如果您可以详细说明您以编程方式更改颜色的原因?如果你还没有控制背景颜色,那么这似乎有点无意义。如果您正在控制背景颜色,那么您可能正在使用样式,在这种情况下,我可以想到几种方法。

西蒙

答案 3 :(得分:0)

这对我有用:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@+id/actionBarLineParent">
        <shape
            android:id="@+id/actionBarLine"
            android:shape="rectangle" >
            <solid android:color="@color/red_all_files" />
        </shape>
    </item>

    <item
        android:id="@+id/actionBarColourParent"
        android:bottom="2dip">
        <shape
            android:id="@+id/actionBarColour"
            android:shape="rectangle" >
            <solid android:color="@android:color/white" />
        </shape>
    </item>

</layer-list>

然后致电:

final LayerDrawable ld = (LayerDrawable) getResources().getDrawable(R.drawable.actionbar_background);
ld.setDrawableByLayerId(R.id.actionBarLineParent, new ColorDrawable(Color.BLUE));
getActionBar().setBackgroundDrawable(ld);

您需要确保设置android:id