Динамически изменить цвет разделителя панели действий (android:bottom для программно сгенерированного ShapeDrawable)?

Я пытаюсь программно изменить цвет разделителя внизу панели действий. Моя стратегия состоит в том, чтобы установить фон панели действий на программно сгенерированный LayerDrawable, содержащий ShapeDrawable прямоугольников, на основе этот XML:

<?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 является свойством тега элемента, для которого (я думаю) нет программного эквивалента, и я не смог найти какие-либо методы/свойства 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.

РЕДАКТИРОВАТЬ:

setLayerInset, как предложил MH, сделал то, что я хотел. Вот модифицированная версия функции, использующей его:

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;
}

person user460847    schedule 27.06.2013    source источник
comment
Вы указали setLayerInset(int index, int l, int t, int r, int b) попробовать? В документах говорится: Укажите модификаторы границ для drawable[index]. левый += l верхний += t; справа -= г; внизу -= б;   -  person MH.    schedule 04.07.2013
comment
Это сделало это! Большое спасибо - пожалуйста, поместите этот комментарий в качестве ответа, чтобы я мог присудить вам награду.   -  person user460847    schedule 06.07.2013
comment
Рад слышать, что все получилось, и спасибо!   -  person MH.    schedule 06.07.2013


Ответы (4)


Согласно предыдущему комментарию:

Вы указали setLayerInset(int index, int l, int t, int r, int b) попробовать? Документы говорят:

Укажите модификаторы границ для drawable[index]. левый += l верхний += t; справа -= г; низ -= б;

person MH.    schedule 05.07.2013

Судя по исходному коду для LayerDrawable метод, который позволит вам сделать это, является закрытым. Но вы можете сделать это с помощью LayerDrawable, содержащего InsetDrawable

person Tavian Barnes    schedule 04.07.2013

Если вы можете уточнить, по какой причине вы меняете цвет программно? Кажется немного бессмысленным делать это, если вы не контролируете цвет фона. Если вы управляете цветом фона, то вы, вероятно, используете стили, и в этом случае я могу придумать несколько способов сделать это.

Саймон

person Simon    schedule 28.06.2013
comment
Я хочу, чтобы цвет разделителя менялся в зависимости от раздела, в котором находится пользователь, а цвета разделов были получены из веб-службы во время выполнения. Я всегда хочу, чтобы цвет фона панели действий был черным, но НЕ цвет разделительной полосы. - person user460847; 29.06.2013

Это сработало для меня:

<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

person brandall    schedule 13.09.2014