【问题标题】:How can I persist my theme settings in android app?如何在 android 应用程序中保留我的主题设置?
【发布时间】:2019-03-21 06:39:02
【问题描述】:

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

这是我的设置活动:

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

【问题讨论】:

    标签: java android settings


    【解决方案1】:
    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);
    }
    

    【讨论】:

    • 您好 Dishant,不建议仅使用代码回答。我建议您添加更多详细信息和解释,以便我们可以很好地理解您的回答
    • 我有一个辅助类来执行此操作,但我必须在(onStart 或 onResume)重新创建方法中调用我的所有活动,但这会进入无限循环,因此问题。
    【解决方案2】:

    答案确实是重新创建活动,但只有在检查 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();
        }
    

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 根据我的阅读,我只能将主题应用于另一个活动 onCreate(),在 onStart() 或 onResume() 中调用 setTheme 不会改变我的主题。
      • 不,你误解了我的意思。我并不是说在onResumeonStart 上使用setTheme 我的意思是,如果您的应用程序仅更改它的颜色而不是重新设置整个活动主题,那么这可以通过这些方法手动完成。但由于您的应用似乎需要重新设置其活动主题,因此您可以使用其他两个选项之一
      【解决方案4】:

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

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

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

      【讨论】:

      • 我会试试这个方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多