首页 > 解决方案 > 保存在首选项中选择的主题

问题描述

从设置菜单切换应用程序的主题不起作用。从“else”块开始一个主题

SharedPreferences 共享首选项;

final String CURRENT_THEME = "CURRENT_THEME";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
   sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    String theme = sharedPrefs.getString("CURRENT_THEME",null);
    if(theme != null && theme.equals("light"))
    {
        setTheme(R.style.AppThemeLight);
    }
    else
    {
        setTheme(R.style.AppTheme);
    }
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);}

  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.lightTheme:
            SharedPreferences.Editor editor1 = sharedPrefs.edit();
            editor1.putString(CURRENT_THEME, "light");
            editor1.commit();
            return true;
        case R.id.darkTheme:
            SharedPreferences.Editor editor2 = sharedPrefs.edit();
            editor2.putString(CURRENT_THEME, "dark");
            editor2.commit();
            return true;}

标签: androidpreferences

解决方案


从选项菜单中选择主题后更改主题。

并使用editor.apply()而不是editor.commit()

final String CURRENT_THEME = "CURRENT_THEME";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    changeTheme();
    }

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.lightTheme:
            SharedPreferences.Editor editor1 = sharedPrefs.edit();
            editor1.putString(CURRENT_THEME, "light");
            editor1.apply();
            changeTheme();
            return true;
        case R.id.darkTheme:
            SharedPreferences.Editor editor2 = sharedPrefs.edit();
            editor2.putString(CURRENT_THEME, "dark");
            editor2.apply();
            changeTheme();
            return true;}


    private void changeTheme(){
        String theme = sharedPrefs.getString(CURRENT_THEME,"light");
        if(theme != null && theme.equals("light"))
        {
            setTheme(R.style.AppThemeLight);
        }
        else
        {
            setTheme(R.style.AppTheme);
        }
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

推荐阅读