如何在Android应用程序中保留主题设置?

时间:2019-03-21 06:39:02

标签: java android settings

主题在当前活动(设置活动)中发生了变化,但是我必须重新启动其他后台活动才能应用新主题。我在想应该在设置活动中重新启动后台活动,但是我找不到方法。

这是我的设置活动:

public class SettingsActivity extends FragmentActivity implements SharedPreferences.OnSharedPreferenceChangeListener {

    private SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SettingsHelper.onActivityCreateSetTheme(this);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(android.R.id.content, new SettingsFragment())
                .commit();

        prefs = PreferenceManager.getDefaultSharedPreferences(this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        prefs.registerOnSharedPreferenceChangeListener(this);

    }

    @Override
    protected void onPause() {
        super.onPause();
        prefs.unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals("theme")) {
            boolean isDark = prefs.getBoolean("theme", false);
            prefs.edit().putBoolean("theme", isDark).apply();
            SettingsHelper.changeToTheme(this);
        }
    }

4 个答案:

答案 0 :(得分:0)

在您所有的活动中,尝试将以下代码放在onResume()方法中:

@Override
public void onResume(){
    super.onResume();
    boolean isDark = prefs.getBoolean("theme", false);
    if(!isDark){
        recreate();
    }    
}
需要调用

recreate()来重新创建活动,以便可以在当前屏幕上应用新主题。

答案 1 :(得分:0)

没有什么叫做重启活动,它处于后台并且仍然保持在后台。

您只需完成此活动,以便下次使用新主题即可。

或者如果可以手动应用主题,则可以在新主题onResume(或onStart,具体取决于您的逻辑)上应用新主题。

您也可以在onResume上重新创建活动(如果更改了主题),但我不建议您这样做,因为此简历是不必要的,您可以仅使用第一个选项。

答案 2 :(得分:0)

switch (cTheme)
{
    case BLACK:         
        int myTheme = R.style.Default
        activity.setTheme(myTheme);

        //Save your activity theme color
        saveTheme(myTheme);
    break;

    case YELLOW:
        int myTheme = R.style.Green
        activity.setTheme(myTheme);

        //Save your activity theme color
        saveTheme(myTheme);
    break;
}
and change your onActivityCreateSetTheme(Activity activity) to:

public static void onActivityCreateSetTheme(Activity activity, Int cTheme)
Save method

public void saveTheme(int theme)
{
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    prefEditor.putInt("Theme",theme); 
}
Load method

public int loadTheme(){
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

    //Load theme color
    int theme = sharedPreferences.getInt("Theme",Color.RED); //RED is default color, when nothing is saved yet

    return theme;
}
Important: call loadTheme() before setContentView() so your onCreate() should be like:

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  int theme = loadTheme();        //Load your theme here!!!!
  CustomazationProcess.onActivityCreateSetTheme(this, theme);
  setContentView(R.layout.something1);

  findViewById(R.id.black).setOnClickListener(this);
  findViewById(R.id.yellow).setOnClickListener(this);
}

答案 3 :(得分:0)

答案确实是要重新创建活动,但只有在检查得到的值onCreate与一个onResume不同之后才能进行。 链接到相关的SO问题:Refresh(recreate) the activities in back stack when change locale at run time

@Override
    protected void onCreate() {
        super.onCreate()
        preferences = PreferenceManager.getDefaultSharedPreferences(this);
        isDark = preferences.getBoolean("theme", false);
    }

@Override
    protected void onResume() {
        super.onResume();
        if(isDark != preferences.getBoolean("theme", false))
            recreate();
    }