繁体   English   中英

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

[英]How can I persist my theme settings in android app?

主题在当前活动(设置活动)中更改,但我必须重新启动其他后台活动才能应用新主题。 我认为应该在设置活动中重新启动后台活动,但我找不到如何。

这是我的设置活动:

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);
        }
    }

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

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

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

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

您可以简单地完成此活动,以便下次开始使用新主题。

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

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

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);
}

答案确实是重新创建活动,但只有在检查到onCreate的值与onResume上的值不同之后。 链接到相关的SO问题: 在运行时更改区域设置时刷新(重新创建)后台堆栈中的活动

@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();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM