java - 如何让我的主题以编程方式延续到其他活动中?
问题描述
我在我的应用程序的设置页面中创建了一个功能,其中包含一个开关 - 按下时 - 切换到辅助“夜间”主题。我大部分时间都按照本教程进行操作。但是,我不知道如何将这种夜间模式带入我的其他活动中?我试过在我的主要活动中调用“如果开关检查”,但它显然没有看到那个开关。我主要需要知道的是,如何检查另一个活动中的开关状态?这甚至是正确的做法吗?让我知道我是否在这个问题上遗漏了任何其他内容。
// ======== 设置页面的代码 ======== //
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
// ======== Night Mode ======== //
SwitchCompat switchCompat;
final SharedPref sharedPref;
sharedPref = new SharedPref(this);
if (sharedPref.loadNightModeState()) {
setTheme(R.style.AppTheme_Night);
getSupportActionBar().setBackgroundDrawable(getDrawable(R.drawable.actionbar));
actionBarDrawerToggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.BackgroundLight));
} else setTheme(R.style.AppTheme);
setContentView(R.layout.activity_settings);
switchCompat = (SwitchCompat) findViewById(R.id.night_switch);
if (sharedPref.loadNightModeState()) {
switchCompat.setChecked(true);
}
switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
sharedPref.setNightModeState(true);
restartApp();
} else {
sharedPref.setNightModeState(false);
restartApp();
}
}
});
}
private void restartApp() {
Intent intent = new Intent(getApplicationContext(), SettingsActivity.class);
startActivity(intent);
finish();
}
// ======== SharedPref 代码 ======== //
public class SharedPref {
private SharedPreferences sharedPreferences;
public SharedPref(Context context) {
sharedPreferences = context.getSharedPreferences("filename", Context.MODE_PRIVATE);
}
public void setNightModeState(Boolean state) {
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("NightMode",state);
editor.apply();
}
public Boolean loadNightModeState (){
Boolean state = sharedPreferences.getBoolean("NightMode", false);
return state;
}
解决方案
在你的应用程序类里面onCreate
SharedPreferences sharedPreferences = getSharedPreferences("Your_Shared_pref", Context.MODE_PRIVATE);
boolean nightMode = sharedPreferences.getBoolean(SettingsActivity.DARK_THEME_PREFERENCE_KEY, false);
AppCompatDelegate.setDefaultNightMode(nightMode ? MODE_NIGHT_YES : MODE_NIGHT_NO);
比在您的活动中,请执行以下操作:
switchCompat.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
AppCompatDelegate.setDefaultNightMode(isChecked ? MODE_NIGHT_YES : MODE_NIGHT_NO);
if (isChecked) {
sharedPref.setNightModeState(true);
recreate();
} else {
sharedPref.setNightModeState(false);
recreate();
}
}
});
@Override
public void recreate() {
finish();
overridePendingTransition(R.anim.anime_fade_in,
R.anim.anime_fade_out);
startActivity(getIntent());
overridePendingTransition(R.anim.anime_fade_in,
R.anim.anime_fade_out);
}
你可以在网上找到动画xml。
推荐阅读
- python-3.x - 为什么调用 Google Slides API 返回错误?
- linux - 在 linux mint 上更新 glibc 以进行 sbcl 安装
- python - python - 尝试更新二维列表中的元素
- google-apps-script - 如何在 Google Apps Script Webapp 上为并发用户提供便利?
- javascript - 如何使用嵌套 HTML作为 JavaScript 对象/数组键
- react-native - 是否有任何 React Native 库可以导航到具有方向和多个航点的 Google 地图应用程序?
- java - getResource 和 getResourceAsStream 之间的资源名称不同
- django - 如何获取 Null 值以在 serializers.DateTimeField() 字段中进行验证?
- c# - .NET core OPTIONS 请求返回 405 错误
- javascript - 显示长度 display="none"; 使用 javascript