问题描述
我是 android 开发的新手 我想创建一个将亮模式转换为暗模式的应用程序 我有一个名为启用暗模式的按钮 我想在按下该按钮时启用暗模式,我打开了暗模式,但是我还想更改按钮中的文本以在单击按钮后启用灯光模式。当我使用 setText()
方法更改 onclick
方法中的文本时
框中的文本仅在我按下按钮 2 次时才会更改,但我希望第一次按下按钮后文本立即更改
这是我的java代码
public class MainActivity extends AppCompatActivity {
private Button darkmode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
darkmode = (Button) findViewById(R.id.darkmodebutton);
darkmode.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
darkmode.setText("enable light mode");
}
});
}
}
谁能帮帮我,拜托 这是应用程序的行为方式,我制作了一个 gif
解决方法
我认为应用程序生命周期会在主题更改时重置。您可以使用生命周期感知状态变量来跟踪主题状态。
您可以阅读更多相关信息here。
Boolean isLightThemeEnabled = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
theme = savedInstanceState.getString("THEME_KEY");
}
// YOUR USUAL CODE
// MAKE SURE TO UPDATE THE THEME STATE VARIABLE
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
if(!isLightThemeEnabled) {
darkmode.setText("enable light mode");
}
else {
.....
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString("THEME_KEY",isLightThemeEnabled);
super.onSaveInstanceState(outState);
}
,
我对此的看法:
您没有显示将其更改为 Light 模式,我相信这会反映相同的行为。
当您使用 setDefaultNightMode()
更改默认模式时会发生什么,它会在执行此行的那一刻重新创建活动,这意味着您的代码在更改时永远不会到达第二行 setText()
默认模式如下图所示。您可以在 official docs 中进一步阅读。
但是,当模式已经改变时,带有 setDefaultNightMode()
的第一行什么都不做,因为模式已经改变,这导致第二次改变文本,这意味着改变文本,要么应该是一种回调机制,或者您必须在更改模式之前更改文本。
此外,您可以在活动重新启动和创建时获取当前模式,并根据当前模式设置文本,这绝对是一种可行的方式。
因此,要检查活动创建或娱乐的模式,您可以这样做:
int currentNightMode = getResources().getConfiguration().uiMode
& Configuration.UI_MODE_NIGHT_MASK
when(currentNightMode) {
Configuration.UI_MODE_NIGHT_NO ->
// Night mode is not active,we're in day time
Configuration.UI_MODE_NIGHT_YES ->
// Night mode is active,we're at night!
Configuration.UI_MODE_NIGHT_UNDEFINED ->
// We don't know what mode we're in,assume notnight
}
并根据上述情况设置按钮的文本。
你的回答让我读到了我也想实现的这个,我找到了一篇很好的文章,从中引用了代码,在这里阅读 - DayNight — Adding a dark theme to your app