Динамическое изменение стиля всех кнопок

У меня есть стиль для всех кнопок, объявленных в values->styles.xml, например.

 <style name="BlueButton" parent="android:style/Widget.Button">
        <item name="android:background">@color/blue</item>
 </style>

а в целом тема как

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:buttonStyle">@style/BlueButton</item>
</style>

Я хочу изменить цвет всех кнопок в своем приложении в зависимости от того, какой цвет выберет пользователь. Есть ли способ определить разные стили в файле styles.xml и динамически назначить их кнопкам.

Обратите внимание, я хочу изменить цвет всех кнопок в моем приложении одновременно, а не по одной. Например, скажем, в настоящее время все мои кнопки черные, и когда пользователь выбирает красную тему, я хочу, чтобы все кнопки в приложении имели красный фон.


person Vamsi Challa    schedule 30.12.2014    source источник
comment
создавать разные стили и назначать их кнопкам, используя свойство стиля.   -  person Pragnesh Ghoda シ    schedule 30.12.2014


Ответы (2)


Попробуйте использовать концепцию тематики.

  • Сначала создайте атрибут для кнопки

<attr format="reference" name="button_style"/>

  • Затем создайте стиль, как вы хотите:

<style name="BlueButton" parent="android:style/Widget.Button"> <item name="android:background">@color/blue</item> </style>

  • А затем применить к теме:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="button_style">@style/BlueButton</item> </style>

  • Наконец, примените это к кнопке в Layout xml

<Button style="?button_style" />

Затем, если вы хотите изменить другую тему, создайте такую ​​​​же, как (2 и 3 точки), она автоматически применится к вашей кнопке.

person Community    schedule 30.12.2014

Вы можете изменить фон кнопки программно. И да, вызывайте этот метод только один раз в каждом Activity, например, когда вы объявляете тему для Activity в manifest.xml. Один ресурс color или drawable применяется ко всем кнопкам в вашем Activity. Итак, следуйте моим шагам:

Создать новый сторонний курс

Здесь я назвал этот класс ButtonBackground:

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.Button;

public class ButtonBackground {

    /* This method is used to change the background with "drawable" resource. Maximum
     * button to change its background is 5, no more. It caused by button's parameter
     * only available for 5. You can add new parameter (button6, button 7, etc) with "int" type if needed.
     */
    public void setButtonBackgroundDrawable(Context context, Activity activity, int drawable,
            int button1, int button2, int button3, int button4, int button5) {

        Drawable backgroundDrawable = context.getResources()
                .getDrawable(drawable);
        Button a = (Button) activity.findViewById(button1);
        Button b = (Button) activity.findViewById(button2);
        Button c = (Button) activity.findViewById(button3);
        Button d = (Button) activity.findViewById(button4);
        Button e = (Button) activity.findViewById(button5);

        if (button1 != 0) {
            a.setBackground(backgroundDrawable);
        }
        if (button2 != 0) {
            b.setBackground(backgroundDrawable);
        }
        if (button3 != 0) {
            c.setBackground(backgroundDrawable);
        }
        if (button4 != 0) {
            d.setBackground(backgroundDrawable);
        }
        if (button5 != 0) {
            e.setBackground(backgroundDrawable);
        }
    }

    /* This method is used to change the background with "color" resource. Maximum
     * button to change its background is 5, no more. It caused by button's parameter
     * only available for 5. You can add new parameter (button6, button 7, etc) with "int" type if needed.
     */
    public void setButtonBackgroundColor(Context context, Activity activity, int color,
            int button1, int button2, int button3, int button4, int button5) {

        int backgroundColor = context.getResources().getColor(color);
        Button a = (Button) activity.findViewById(button1);
        Button b = (Button) activity.findViewById(button2);
        Button c = (Button) activity.findViewById(button3);
        Button d = (Button) activity.findViewById(button4);
        Button e = (Button) activity.findViewById(button5);

        if (button1 != 0) {
            a.setBackgroundColor(backgroundColor);
        }
        if (button2 != 0) {
            b.setBackgroundColor(backgroundColor);
        }
        if (button3 != 0) {
            c.setBackgroundColor(backgroundColor);
        }
        if (button4 != 0) {
            d.setBackgroundColor(backgroundColor);
        }
        if (button5 != 0) {
            e.setBackgroundColor(backgroundColor);
        }
    }
}

Как использовать?

Например, у меня есть 3 кнопки, и я хочу изменить их фон, используя ресурс drawable. Это buttonId1, buttonId2 и buttonId3. Моего drawable зовут background_button_drawable.xml, а моего нынешнего Activity зовут MainActivity. Поэтому я пишу код ниже внутри метода onCreate():

ButtonBackground buttonBackground = new ButtonBackground();
buttonBackground.setButtonBackgroundDrawable(getApplicationContext(), MainActivity.this,
            R.drawable.background_button_drawable, R.id.buttonId1, R.id.buttonId2, R.id.buttonId3, 0, 0);

Примечание.

В приведенном выше коде есть два 0. Это означает, что button4 и button5 в параметре пусты. Поэтому дайте значение 0, если кнопка пуста или является лишним параметром.

Что делать, если у меня 6 кнопок?

Вам снова нужен один параметр, и вы должны добавить новый параметр (button6). Параметр должен int типа:

public void setButtonBackgroundDrawable(... , int button6) {

И добавьте его внутрь:

Button f = (Button) activity.findViewById(button6);

if (button6 != 0) {
    f.setBackground(backgroundDrawable);
}

Итак, когда вы его используете:

ButtonBackground buttonBackground = new ButtonBackground();
buttonBackground.setButtonBackgroundDrawable(getApplicationContext(), MainActivity.this,
            R.drawable.background_button_drawable, R.id.buttonId1, R.id.buttonId2, R.id.buttonId3, buttonId4, buttonId5, buttonId6);

Как насчет изменения фона с помощью ресурса color?

Вам нужно изменить метод setButtonBackgroundDrawable() на setButtonBackgroundColor(). Это будет выглядеть так:

ButtonBackground buttonBackground = new ButtonBackground();
buttonBackground.setButtonBackgroundColor(getApplicationContext(), MainActivity.this,
                R.color.background_button_blue, R.id.buttonId1, R.id.buttonId2, R.id.buttonId3, 0, 0);

Он очень прост в использовании, не так ли?

person Anggrayudi H    schedule 31.12.2014