5

Buttons with different colors and styles

 2 years ago
source link: https://www.codesd.com/item/buttons-with-different-colors-and-styles.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Buttons with different colors and styles

advertisements

I'm working on an application that contains some buttons defined via layout.xml like this

<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/largebutton" >
</Button>

@drawable/largebutton looks like this

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" >
        <shape>
            <gradient android:startColor="@color/menu_button_active_start" android:endColor="@color/menu_button_active_end" android:angle="270" />
            <stroke android:width="@dimen/largebutton_stroke" android:color="@color/menu_button_stroke" />
            <corners android:radius="@dimen/largebutton_radius" />
            <padding android:left="@dimen/largebutton_padding_leftright" android:top="@dimen/largebutton_padding_topbottom" android:right="@dimen/largebutton_padding_leftright" android:bottom="@dimen/largebutton_padding_topbottom" />
        </shape>
    </item>

    <item android:state_focused="true" >
        <shape>
            <gradient android:startColor="@color/menu_button_focused_start" android:endColor="@color/menu_button_focused_end" android:angle="270" />
            <stroke android:width="@dimen/largebutton_stroke" android:color="@color/menu_button_focused_stroke" />
            <corners android:radius="@dimen/largebutton_radius" />
            <padding android:left="@dimen/largebutton_padding_leftright" android:top="@dimen/largebutton_padding_topbottom" android:right="@dimen/largebutton_padding_leftright" android:bottom="@dimen/largebutton_padding_topbottom" />
        </shape>
    </item>
 .....
</selector>

All properties like padding, stroke, radius are the same, except gradient colors in different states. My problem is that my application has to have more styles. You can imagine it as you have list of colors and when you choose one application changes all colors to selected one. So if you have 20 colors, 20 different xmls isn't the right way.

Both startColor and endColor values for all android:states are downloaded from web and saved to DB and I don't know how many of them are there.

Is there any way to achieve this behavior? I've searched all forums and the most of answers were that it is imposible. I found one 'solution' overwriting colors.xml but it doesn't seems to be the best solution to me.

So my question is, can I dynamically change color in colors.xml? Something like this

List<Colors> colors = downloadColorsFromWeb();

Button b = new Button;
b.setDrawable(drawable.with(colors));

Thank you all in advance.

nosko.


You could probably dynamically generate a drawable for each color you download. Check the GradientDrawable class. I think you can provide start/end colors during the initialization and set the stroke and corner radius properties after that. But you'll have to find out about the padding yourself. I am not sure.

After you create the drawable, you can use it in the button's setBackgroundDrawable

edit: probably setting the button's padding would do the trick

edit2: you can setState to the drawable but I am not sure how to set different background drawable for each state of the button.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK