Как сохранить настройки темы в приложении для Android? - PullRequest
0 голосов
/ 21 марта 2019

Тема изменяется в текущей активности (Настройки активности), но мне нужно перезапустить другие фоновые действия, чтобы применить новую тему. Я думаю, что фоновые операции должны быть перезапущены в настройках активности, но я не могу найти, как.

Это мои настройки Активность:

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 голосов
/ 21 марта 2019

Ответ действительно заключался в воссоздании действия, но только после проверки, что значение, полученное 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();
    }
0 голосов
/ 21 марта 2019

Нет ничего, что называется перезапуском активности, пока оно находится в фоновом режиме, и все еще держит его в фоновом режиме.

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

или если ваша тема может быть применена вручную, тогда вы можете применить новую тему на onResume (или onStart, в зависимости от вашей логики).

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

0 голосов
/ 21 марта 2019
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);
}
0 голосов
/ 21 марта 2019

Во всех ваших действиях попробуйте поместить следующий код в метод onResume ():

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

пересоздать () необходимо вызвать для воссоздания действия, чтобы новыйТема может быть применена на текущем экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...