Переключение тем - PullRequest
       18

Переключение тем

1 голос
/ 20 сентября 2019

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

ThemeActivity.java

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    themeUtils.onActivityCreateSetTheme(this);
    setContentView(R.layout.activity_theme);


    blackbtn = findViewById(R.id.blackbutton);
    bluebtn = findViewById(R.id.bluebutton);

    blackbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            themeUtils.changeToTheme(ThemeActivity.this, themeUtils.BLACK);
        }
    });

    bluebtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            themeUtils.changeToTheme(ThemeActivity.this, themeUtils.BLUE);
        }
    });

}

ThemeUtils.java

public class themeUtils
{

private static int cTheme;
public final static int BLACK = 0;
public final static int BLUE = 1;

public static void changeToTheme(Activity activity, int theme)
{
    cTheme = theme;
    activity.finish();
    activity.startActivity(new Intent(activity, activity.getClass()));
}

public static void onActivityCreateSetTheme(Activity activity)
{
    switch (cTheme)
    {

        default:
        case BLACK:
            activity.setTheme(R.style.BlackTheme);
            break;
        case BLUE:
            activity.setTheme(R.style.BlueTheme);
            break;
    }
}

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

используйте значение атрибута, чтобы установить цвет

, например, вот цвет для textview

<attr name="textviewcolor" format="color"></attr>

создать разные стили для выбора другой темы в style.xml

вот цвет текста для стиля темной темы

<style name="AppTheme.Dark" parent="Theme.AppCompat.Light.NoActionBar"><item name="textviewcolor">#fff</item></style>

вот цвет текста для стиля темы по умолчанию

<style name="AppTheme.Defult" parent="Theme.AppCompat.Light.NoActionBar"><item name="textviewcolor">#000</item></style>

используйте это значение атрибута (textviewcolor) для textview, чтобы установить цвет, подобный этому

                      <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="text"
                        android:textColor="?attr/textviewcolor"/>

вам просто нужно изменить название темы в sharedpreference при нажатии кнопки и обновить действие, остальные вещи упоминаютсяниже, как вы собираетесь это сделать ..

сначала создайте класс утилит темы, подобный этому

public class ThemeUtil {

public static final int THEME_DEFAULT=1;
public static final int THEME_DARK=2;
public static final int ALERTTHEME=3;
public static final int ALERTTHEMEDARK=4;



public static int getThemeId(int theme){
    int themeId=0;
    switch (theme){

        case THEME_DARK:
            themeId = R.style.AppTheme_Dark;
            break;

        case THEME_DEFAULT :
            themeId = R.style.AppTheme;
            break;

        default:
            break;
    }
    return themeId;
}}

предложение: используйте sharedpreference, чтобы дать имяваша тема

затем создайте один абстрактный класс, чтобы установить тему для всей деятельности, используя расширение этого класса

public class ChangethemeActivity extends AppCompatActivity{

@Override
protected void onCreate(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    //get your theme name using sharedpreference and check what you have saved in theme name value

    if(dark){
    setTheme(ThemeUtil.getThemeId(1));
    }
    else{
      setTheme(ThemeUtil.getThemeId(2));
    }  }}}

и, наконец: use ChangethemeActivity в действии вместо AppCompatActivity в вашей деятельности, где вы хотите сменить тему

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

1 голос
/ 20 сентября 2019

Создайте базовое действие и расширьте все остальные из него, затем в методе базового действия onCreate установите тему, например:

public abstract class BaseActivity extends AppCompatActivity{
    private int theme;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(theme);
    }
}

private void setTheme(int theme){
    this.theme = theme;
}

Затем, когда вы хотите изменить тему, просто установитедругой идентификатор ресурса темы в теме и перезапустите свою деятельность:

setTheme(R.style.AppThemeChristmas);
Intent intent = getIntent();
finish();
startActivity(intent);
...