Java 当应用程序完全关闭时,如何在android中保存暗模式状态
我有个小问题。当我在我的应用程序中打开黑暗模式,然后在android中完全关闭我的应用程序,当我重新打开它时,它会返回到光明模式。我使用AppCompatDelegate来执行此操作。我有一个设置片段,带有一个开关,可以打开或关闭黑暗模式,效果很好。我对这个片段有一个共享的首选项,它可以工作。唯一的问题是,应用程序的其余部分在完全关闭并重新打开后不会保持黑暗模式。有没有一种方法可以保存并在我关闭或重新打开时恢复黑暗模式 以下是我的MainActivity代码:Java 当应用程序完全关闭时,如何在android中保存暗模式状态,java,android,android-dark-theme,android-darkmode,Java,Android,Android Dark Theme,Android Darkmode,我有个小问题。当我在我的应用程序中打开黑暗模式,然后在android中完全关闭我的应用程序,当我重新打开它时,它会返回到光明模式。我使用AppCompatDelegate来执行此操作。我有一个设置片段,带有一个开关,可以打开或关闭黑暗模式,效果很好。我对这个片段有一个共享的首选项,它可以工作。唯一的问题是,应用程序的其余部分在完全关闭并重新打开后不会保持黑暗模式。有没有一种方法可以保存并在我关闭或重新打开时恢复黑暗模式 以下是我的MainActivity代码: package com.barza
package com.barzalou.lpapineau.test;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import com.barzalou.lpapineau.test.ui.CheckedChangeCallback;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
public class MainActivity extends AppCompatActivity implements CheckedChangeCallback {
private AppBarConfiguration mAppBarConfiguration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow, R.id.nav_maps)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_exit) {
finish();
System.exit(0);
}
return false;
}
public void onCheckedChange(boolean isChecked) {
if (isChecked) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
Log.d("Dark Mode Switch State", "On");
}
else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
Log.d("Dark Mode Switch State", "Off");
}
}
int NightMode;
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
这是我设置碎片的代码:
package com.barzalou.lpapineau.test.ui.settings;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.Switch;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders;
import com.barzalou.lpapineau.test.R;
import com.barzalou.lpapineau.test.ui.CheckedChangeCallback;
import android.content.Context;
import static android.content.Context.MODE_PRIVATE;
public class SettingsFragment extends Fragment {
private SettingsViewModel settingsViewModel;
private static Switch DarkMode;
private boolean SwitchOnOff;
private CheckedChangeCallback callback = null;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
settingsViewModel = ViewModelProviders.of(this).get(SettingsViewModel.class);
View root = inflater.inflate(R.layout.fragment_settings, container, false);
final TextView textView = root.findViewById(R.id.text_settings);
settingsViewModel.getText().observe(getViewLifecycleOwner(), new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
textView.setText(s);
}
});
return root;
}
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
DarkMode = (Switch) getView().findViewById(R.id.DarkModeSwitch);
DarkMode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
callback.onCheckedChange(isChecked);
}
});
}
public void onAttach(final Activity activity) {
super.onAttach(activity);
if (activity instanceof CheckedChangeCallback) {
this.callback = (CheckedChangeCallback) activity;
}
}
public void onDetach() {
super.onDetach();
callback = null;
}
//Save and Restore Switch, Buttons, Textboxs, etc -----------------------
@Override
public void onStop() {
super.onStop();
try {
saveData();
Log.d("Data Save", "Data was saved");
} catch (Exception e) {
Log.d("Data Save", "Data could not be saved");
}
}
@Override
public void onStart() {
super.onStart();
try {
loadData();
updateViews();
Log.d("Data Restore", "Data was restored");
} catch (Exception e) {
Log.d("Data Restore", "Data was not able to get restored");
}
}
//------------------------------------------------------------------------
// Save data, load data and update views functions -----------------------
public void saveData() {
SharedPreferences sharedPreferences = getContext().getSharedPreferences("SharedPrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
// Add other Switches, Buttons, Texboxes, etc to save
editor.putBoolean("SwitchState", DarkMode.isChecked());
// Example: editor.putString("String1", textview.getText().toString());
//---------------------------------------------------
editor.apply();
}
public void loadData() {
SharedPreferences sharedPreferences = getContext().getSharedPreferences("SharedPrefs", MODE_PRIVATE);
SwitchOnOff = sharedPreferences.getBoolean("SwitchState", true); //Change true to false to make the switch on by default
}
public void updateViews() {
DarkMode.setChecked(SwitchOnOff);
}
//------------------------------------------------------------------------
}
package com.barzalou.lpapinou.test.ui.settings;
导入android.app.Activity;
导入android.content.SharedReferences;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.CompoundButton;
导入android.widget.Switch;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入androidx.fragment.app.fragment;
导入androidx.lifecycle.Observer;
导入androidx.lifecycle.ViewModelProviders;
导入com.barzalou.lpapeniou.test.R;
导入com.barzalou.lpao.test.ui.CheckedChangeCallback;
导入android.content.Context;
导入静态android.content.Context.MODE_PRIVATE;
公共类设置片段扩展片段{
私人设置查看模型设置查看模型;
专用静态开关暗模式;
私有布尔开关关断;
private CheckedChangeCallback callback=null;
创建视图时的公共视图(@NonNull LayoutInflater inflater、ViewGroup容器、Bundle savedInstanceState){
settingsViewModel=ViewModelProviders.of(this.get)(settingsViewModel.class);
视图根=充气机。充气(R.layout.fragment\u设置,容器,错误);
final TextView TextView=root.findviewbyd(R.id.text\u设置);
settingsViewModel.getText().observe(getViewLifecycleOwner(),new Observer()){
@凌驾
公共void onChanged(@Nullable String s){
textView.setText;
}
});
返回根;
}
已创建视图上的公共void(视图,捆绑保存状态){
super.onViewCreated(视图,savedInstanceState);
DarkMode=(开关)getView().findViewById(R.id.DarkModeSwitch);
setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
callback.onCheckedChange(isChecked);
}
});
}
公共活动(最终活动){
超级转速计(活动);
if(CheckedChangeCallback的活动实例){
this.callback=(CheckedChangeCallback)活动;
}
}
公共无效连接(){
super.onDetach();
callback=null;
}
//保存和恢复开关、按钮、文本框等-----------------------
@凌驾
公共void onStop(){
super.onStop();
试一试{
saveData();
Log.d(“数据保存”,“数据已保存”);
}捕获(例外e){
Log.d(“数据保存”,“数据无法保存”);
}
}
@凌驾
public void onStart(){
super.onStart();
试一试{
loadData();
updateViews();
Log.d(“数据恢复”,“数据已恢复”);
}捕获(例外e){
Log.d(“数据还原”,“数据无法还原”);
}
}
//------------------------------------------------------------------------
//保存数据、加载数据和更新视图功能-----------------------
公共void saveData(){
SharedReferences SharedReferences=getContext().GetSharedReferences(“SharedReferences”,MODE\u PRIVATE);
SharedReferences.Editor=SharedReferences.edit();
//添加其他开关、按钮、文本框等以保存
putBoolean(“SwitchState”,DarkMode.isChecked());
//示例:editor.putString(“String1”,textview.getText().toString());
//---------------------------------------------------
editor.apply();
}
公共void loadData(){
SharedReferences SharedReferences=getContext().GetSharedReferences(“SharedReferences”,MODE\u PRIVATE);
SwitchOnOff=SharedReferences.getBoolean(“SwitchState”,true);//将true更改为false以在默认情况下打开开关
}
public void updateViews(){
暗模式。设置已检查(开关关闭);
}
//------------------------------------------------------------------------
}
您应该在应用程序的onCreate()方法中设置它
class MyApp : Application() {
@Override
public void onCreate() {
super.onCreate();
boolean isNightMode = sharedPreferences.getBoolean("SwitchState", true);
if (isNightMode) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
}
}
}
不要忘记添加AndroidManifest
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
我找到了一个简单明了的答案。我对它进行了多次测试,以确保其正确性。只需在MainActivity中添加以下变量:
package com.barzalou.lpapineau.test;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;
import com.barzalou.lpapineau.test.ui.CheckedChangeCallback;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
public class MainActivity extends AppCompatActivity implements CheckedChangeCallback {
private AppBarConfiguration mAppBarConfiguration;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = findViewById(R.id.drawer_layout);
NavigationView navigationView = findViewById(R.id.nav_view);
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
mAppBarConfiguration = new AppBarConfiguration.Builder(
R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow, R.id.nav_maps)
.setDrawerLayout(drawer)
.build();
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
NavigationUI.setupWithNavController(navigationView, navController);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
return NavigationUI.navigateUp(navController, mAppBarConfiguration)
|| super.onSupportNavigateUp();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_exit) {
finish();
System.exit(0);
}
return false;
}
public void onCheckedChange(boolean isChecked) {
if (isChecked) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
Log.d("Dark Mode Switch State", "On");
}
else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
Log.d("Dark Mode Switch State", "Off");
}
}
int NightMode;
SharedPreferences sharedPreferences;
SharedPreferences.Editor editor;
之后,您需要在MainActivity的OnCreate()方法中添加以下行:
要完成此操作,请使用OnSaveInstanceState方法将所有变量保存在共享首选项中:
sharedPreferences = getSharedPreferences("SharedPrefs", MODE_PRIVATE);
NightMode = sharedPreferences.getInt("NightModeInt", 1);
AppCompatDelegate.setDefaultNightMode(NightMode);
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
NightMode = AppCompatDelegate.getDefaultNightMode();
sharedPreferences = getSharedPreferences("SharedPrefs", MODE_PRIVATE);
editor = sharedPreferences.edit();
editor.putInt("NightModeInt", NightMode);
editor.apply();
}
这就是保存整个应用程序的暗模式状态所需的全部操作,即使应用程序被操作系统终止或终止。暗模式在设置片段中保存得非常好。当我关闭应用程序并重新打开它时,它不会将其保存到除设置片段之外的任何页面。我应该把它放在MainActivity中并修改它吗?你应该把它放在应用程序类中,这样当你关闭应用程序并重新打开它时,整个屏幕的主题都会完全改变。我不确定“你应该在应用程序的onCreate()方法中设置它”是什么意思。那么,您是指MainActivity的onCreate方法吗?请检查我的编辑