2017-02-11 15 views
0

Я пытаюсь изменить тему своего приложения, когда возвращаюсь к активности из Activity.Android change theme on result activity

Измените тему, после чего тема приложения должна измениться. К сожалению, этого не происходит. Когда я перехожу назад и вперед между настройками и MainActivity, ничего не происходит. Я не заканчиваю MainActivity, но заканчиваю действие настроек.

Главная -> Настройки, изменение темы (Тема не меняется) -> Вернуться к Main (Ничего не изменилось) -> Настройки (Еще не изменилась) -> Main (Это изменило)

Я надеваю Не знаю, как изменить его сразу, и я использую метод recreate(), но он все еще не работает.

SettingsActivity:

public class GeneralPreferenceFragment extends PreferenceFragment { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      addPreferencesFromResource(R.xml.pref_general); 
      setHasOptionsMenu(true); 

      // Bind the summaries of EditText/List/Dialog/Ringtone preferences 
      // to their values. When their values change, their summaries are 
      // updated to reflect the new value, per the Android Design 
      // guidelines. 
      //bindPreferenceSummaryToValue(findPreference("themeChanger")); 
      //bindPreferenceSummaryToValue(findPreference("example_list")); 

      SharedPreferences prefs = getSharedPreferences("theming", MODE_PRIVATE); 
      String themer = prefs.getString("themeID", "0"); 
      val = themer; 

      Preference.OnPreferenceChangeListener pop = new Preference.OnPreferenceChangeListener() { 
       @Override 
       public boolean onPreferenceChange(Preference preference, Object o) { 
        String stringValue = o.toString(); //the value set in the strings.xml 
        String preferenceKey = preference.getKey(); //the key set in the actual xml file 

        Log.e("Settings " + preference.getKey(), "Clicked " + o); 

        setThemed(); 
        checkValues(); 

        if (preference instanceof ListPreference) { 
         // For list preferences, look up the correct display value in 
         // the preference's 'entries' list. 
         ListPreference listPreference = (ListPreference) preference; 
         int index = listPreference.findIndexOfValue(stringValue); 
         // Set the summary to reflect the new value. 
         preference.setSummary(
           index >= 0 
             ? listPreference.getEntries()[index] 
             : null); 

         if(preferenceKey.equalsIgnoreCase("themeChanger")) { 
          //setThemed(); 
         } 



         if(!val.equals(stringValue)) { 
          Log.e("Settings2 " + preference.getKey(), "Clicked2 " + o); 

         } 



        } else { 
         // For all other preferences, set the summary to the value's 
         // simple string representation. 
         preference.setSummary(stringValue); 
        } 
        return true; 
       } 
      }; 

      findPreference("themeChanger").setOnPreferenceChangeListener(pop); 

      pop.onPreferenceChange(findPreference("themeChanger"), 
        PreferenceManager 
          .getDefaultSharedPreferences(findPreference("themeChanger").getContext()) 
          .getString(findPreference("themeChanger").getKey(), "")); 



     } 

public void setThemed() { 
     SharedPreferences prefs = getSharedPreferences("theming", MODE_PRIVATE); 
     String themer = prefs.getString("themeID", "0"); 
     setTheme(themer.equals("2") ? R.style.NightTheme1 : R.style.LightTheme); 

    } 

    private void checkValues() { 
     SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
     String themed = sharedPrefs.getString("themeChanger", "0"); 

     SharedPreferences.Editor editor = getSharedPreferences("theming", MODE_PRIVATE).edit(); 
     editor.putString("themeID", themed); 
     editor.apply(); 
    } 

ответ

-1

В нашем приложении мы делаем это с помощью следующего метода:

  1. в основной деятельности, до запуска деятельности Настройки, сохранить текущее значение темы в lastTheme поле
  2. В главной операции, в onResume, проверьте, содержит ли значение lastTheme значение, если да, проверьте, отличается ли текущая тема.
  3. Если было изменено изменение темы, вызовите Activity.recreate(), чтобы основная активность была воссоздана с выбранной вами темой.

Пример кода:

protected void launchSettings() { 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    lastTheme = prefs.getInt("theme", -1); 

    // start settings activity here... 
} 
@Override 
protected void onResume() { 
    super.onResume(); 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    int selectedTheme = prefs.getInt("theme", -1); 
    if ((lastTheme != -1) && (lastTheme != selectedTheme)) { 
     Log.d(TAG, "the theme was changed"); 
     recreate(); 
    } 
    lastTheme = -1; 
} 
+0

ли 'lastTheme' поле INT или тему? – Zefyr

+0

это не имеет значения, но я думаю, что int было бы проще реализовать. – marmor

+0

Я пробовал это, и я все еще получаю ту же проблему. – Zefyr