2016-11-25 4 views
0

私はリロードせずに瞬時に設定で昼と夜のモードを切り替えることができますPocketのようないくつかのアプリを見てきましたが、私は私自身の例であることを行うことができないよ:PreferenceFragmentでDay Night Modeを即時に更新するにはどうすればよいですか?

public class SettingsActivity extends PreferenceActivity { 
    @Override 
    public void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragment()).commit(); 
    } 

    public static class PrefsFragment extends PreferenceFragment{ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      final Context context = getActivity(); 
      addPreferencesFromResource(R.xml.preferences); 
      SwitchPreference dayNightSwitch = (SwitchPreference) findPreference(getString(R.string.pref_day_night_key)); 
      dayNightSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
       @Override 
       public boolean onPreferenceChange(Preference preference, Object newValue) { 
        boolean isNightMode = (boolean) newValue;  
        AppCompatDelegate.setDefaultNightMode(isNightMode? AppCompatDelegate.MODE_NIGHT_YES:AppCompatDelegate.MODE_NIGHT_NO); 
        return true; 
       } 
      }); 
     } 
    } 
} 

それはAppCompatDelegate.setDefaultNightModeのように見えますPreferenceFragmentPreferenceActivityではまったく動作しません。昼夜のモードを即座に更新する方法はありますか?

答えて

1

まず、getActivity().recreate()に電話をかけて、現在のアクティビティに変更を適用する必要があります。

しかし、私はAppCompatPreferenceActivityテンプレートを使用していましたが、不十分です。私はAppCompatActivity source codeをチェックして、昼/夜の切り替えを処理するコードを発見しました。予想通り、コールバックが働い優先してgetActivity().recreate()を呼び出し、それを追加した後

private int mThemeId = 0; 

... 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    final AppCompatDelegate delegate = getDelegate(); 
    delegate.installViewFactory(); 
    delegate.onCreate(savedInstanceState); 
    if (delegate.applyDayNight() && mThemeId != 0) { 
     // If DayNight has been applied, we need to re-apply the theme for 
     // the changes to take effect. On API 23+, we should bypass 
     // setTheme(), which will no-op if the theme ID is identical to the 
     // current theme ID. 
     if (Build.VERSION.SDK_INT >= 23) { 
      onApplyThemeResource(getTheme(), mThemeId, false); 
     } else { 
      setTheme(mThemeId); 
     } 
    } 
    super.onCreate(savedInstanceState); 
} 

@Override 
public void setTheme(@StyleRes final int resid) { 
    super.setTheme(resid); 
    // Keep hold of the theme id so that we can re-set it later if needed 
    mThemeId = resid; 
} 

関連する問題