使用复选框更改应用主题(java)
Changing app theme with checkbox (with java)
我正在为我的应用程序添加深色模式,并在三点菜单(工具栏)中创建了一个复选框。
我想让应用程序在选中该复选框时将主题更改为深色,并在未选中时将其恢复为主主题。
这是我当前的暗模式复选框按钮的 onClick 代码:
if (id == R.id.dark_mode) {
switch (item.getItemId()) {
case R.id.dark_mode:
if (item.isChecked()) {
// If item already checked then unchecked it
item.setChecked(false);
} else {
// If item is unchecked then checked it
item.setChecked(true);
}
default:
return super.onOptionsItemSelected(item);
}
}
如何使用 java 执行此操作?
另外我想让应用记住用户最后是否选择了深色模式。 (这实际上是必需的,因为在 activity 重新启动后,应用程序将返回到它的旧状态。)
要以编程方式更改应用程序的主题,您可以在 onCreate()
方法中的 super.onCreate()
之前使用 setTheme(...)
(来自 this question 的代码):
public void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme); // THIS IS WHERE THE THEME IS SET -- must go before super.onCreate()
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
但是,一旦应用已经运行,这不会更改主题。为此,您需要重新启动应用程序或仅更改活动背景而不实际更改主题。
正在重启应用程序:
代码来自this question,Marc 回答:
Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
更改背景:
如果您需要在应用仍处于 运行 时更改背景,您可以像这样设置布局的背景颜色(此处设置为红色):
layout.setBackgroundColor(Color.RED);
要在应用关闭后保存用户的选择:
最好的方法是使用 SharedPreferences
API。例如,如果您想将背景选择保存为字符串到布尔键值对(其中键是字符串 "background_is_dark"
,值是 true
或 false
) 你可以这样写:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putBoolean("background_is_dark"), true); // here is where you would enter true or false
editor.commit();
要稍后访问该布尔值(如在 onCreate()
中,当您需要决定要设置哪个背景时),您将使用此代码:
Context context = getActivity();
SharedPreferences isDark = context.getSharedPreferences(
"background_is_dark", Context.MODE_PRIVATE);
有关 SharedPreferences
API 的更多信息,请参阅 Android's documentation。
我正在为我的应用程序添加深色模式,并在三点菜单(工具栏)中创建了一个复选框。
我想让应用程序在选中该复选框时将主题更改为深色,并在未选中时将其恢复为主主题。
这是我当前的暗模式复选框按钮的 onClick 代码:
if (id == R.id.dark_mode) {
switch (item.getItemId()) {
case R.id.dark_mode:
if (item.isChecked()) {
// If item already checked then unchecked it
item.setChecked(false);
} else {
// If item is unchecked then checked it
item.setChecked(true);
}
default:
return super.onOptionsItemSelected(item);
}
}
如何使用 java 执行此操作?
另外我想让应用记住用户最后是否选择了深色模式。 (这实际上是必需的,因为在 activity 重新启动后,应用程序将返回到它的旧状态。)
要以编程方式更改应用程序的主题,您可以在 onCreate()
方法中的 super.onCreate()
之前使用 setTheme(...)
(来自 this question 的代码):
public void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme); // THIS IS WHERE THE THEME IS SET -- must go before super.onCreate()
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
但是,一旦应用已经运行,这不会更改主题。为此,您需要重新启动应用程序或仅更改活动背景而不实际更改主题。
正在重启应用程序:
代码来自this question,Marc 回答:
Intent i = getBaseContext().getPackageManager()
.getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
更改背景:
如果您需要在应用仍处于 运行 时更改背景,您可以像这样设置布局的背景颜色(此处设置为红色):
layout.setBackgroundColor(Color.RED);
要在应用关闭后保存用户的选择:
最好的方法是使用 SharedPreferences
API。例如,如果您想将背景选择保存为字符串到布尔键值对(其中键是字符串 "background_is_dark"
,值是 true
或 false
) 你可以这样写:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putBoolean("background_is_dark"), true); // here is where you would enter true or false
editor.commit();
要稍后访问该布尔值(如在 onCreate()
中,当您需要决定要设置哪个背景时),您将使用此代码:
Context context = getActivity();
SharedPreferences isDark = context.getSharedPreferences(
"background_is_dark", Context.MODE_PRIVATE);
有关 SharedPreferences
API 的更多信息,请参阅 Android's documentation。