问题描述
我有一个应用程序,其中我使用AppCompatDelegate和values-night.xml以编程方式在应用程序内切换到Dark主题。我有一个带有SettingsFragment的SettingsActivity.java,在其中设置了一个OnSharedPreferencechangelistener来监听相应的SharedPreferences值。在“设置”页面中,我包括了“暗”模式设置。但是,在切换设置时,暗模式不会自动打开。相反,我必须退出SettingsActivity才能使应用更改模式。 这是我的代码:
SettingsActivity.java
public class SettingsActivity extends AppCompatActivity {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
toolbar = findViewById(R.id.toolbar_settings);
setSupportActionBar(toolbar);
if (findViewById(R.id.fragment_container)!=null) {
if (savedInstanceState!=null) {
return;
}
getFragmentManager().beginTransaction().add(R.id.fragment_container,new SettingsFragment()).commit();
}
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SettingsActivity.this,MainActivity.class);
startActivity(intent);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.settings_menu,menu);
return true;
}
public void savePrefs () {
SharedPreferences sharedPreferences = getSharedPreferences("Shared_Preferences",MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
}
}
SettingsFragment.java
public class SettingsFragment extends PreferenceFragment {
public int currTheme;
public static final String theme = "theme";
private SharedPreferences.OnSharedPreferencechangelistener listener;
private ViewGroup parent;
private View currView;
@Override
public void onCreate(@Nullable Bundle SavedInstanceState) {
super.onCreate(SavedInstanceState);
addPreferencesFromresource(R.xml.preferences);
listener = new SharedPreferences.OnSharedPreferencechangelistener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String s) {
Preference preference = findPreference(s);
if (s.equals(theme)) {
currTheme = Integer.valueOf(sharedPreferences.getString(s,"0"));
switch (currTheme) {
case 2 :
preference.setSummary("Dark");
break;
case 1 :
preference.setSummary("Light");
break;
default:
preference.setSummary("System Settings");
}
preference.setTitle("Theme");
} ...
}
};
}
@Override
public View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
View view = super.onCreateView(inflater,container,savedInstanceState);
parent = container;
currView = view;
view.setBackgroundColor(ContextCompat.getColor(parent.getContext(),R.color.colorPrimary));
return view;
}
@Override
public void onResume() {
super.onResume();
setPreferenceScreen(null);
addPreferencesFromresource(R.xml.preferences);
getPreferenceScreen().getSharedPreferences().registerOnSharedPreferencechangelistener(listener);
...
preferenceTheme.setTitle("Theme");
int themeSet = Integer.valueOf(getPreferenceScreen().getSharedPreferences().getString(theme,"System Settings"));
switch (themeSet) {
case 2 :
preferenceTheme.setSummary("Dark");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
break;
case 1 :
preferenceTheme.setSummary("Light");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
break;
default :
preferenceTheme.setSummary("System Default");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYstem);
}
currView.setBackgroundColor(ContextCompat.getColor(parent.getContext(),R.color.cpWhite));
parent.getContext().setTheme(R.style.PreferenceTheme);
}
@Override
public void onStart() {
super.onStart();
setPreferenceScreen(null);
addPreferencesFromresource(R.xml.preferences);
}
@Override
public void onPause() {
super.onPause();
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferencechangelistener(listener);
}
}
运行时,该片段会记录主题更改,但不会更改主题。 这是怎么回事:
黑暗主题集:
更改为轻主题:
此问题有任何解决方法吗?
解决方法
您似乎没有在首选项更改侦听器中包含任何主题设置逻辑(仅在onResume中)。
尝试在听众中加入AppCompatDelegate.setDefaultNightMode(...)
。