英文:
Switch setOnCheckedChangeListener looping after user input
问题
以下是翻译好的内容:
我正在尝试立即切换到深色模式(无需重新加载),使用一个片段中的开关。
我用来执行此操作的代码片段如下:
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
这在测试中是有效的,但我希望能够使用开关来切换到深色模式,所以我的代码如下:
switch_us_dark_mode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// 开关已启用
Log.i("tag", "切换到深色模式");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
editor.putString("theme", "dark");
}
if (!isChecked) {
// 开关已禁用
Log.i("tag", "切换到浅色模式");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
editor.putString("theme", "light");
}
}
});
然而,在我首次单击开关后,它会出现循环。
我尝试在一个线程中执行它,但是它报错说必须在主线程上运行。
我将移动开关到按钮下面,以便它看起来不像是表单的一部分,但这不是重点。
提前谢谢!
英文:
I am trying to switch to dark mode immediately(without reloading) using a switch in a fragment.
The piece of code that I am using to do this is
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
This is working in testing but I want it to change to dark mode using the switch so my code is the following.
switch_us_dark_mode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
// The toggle is enabled
Log.i("tag", "Hit Dark");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
editor.putString("theme", "dark");
}
if(!isChecked){
// The toggle is disable
Log.i("tag", "Hit Light");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
editor.putString("theme", "light");
}
}
});
This is however looping after the first time I click on the switch.
I tried doing it on a thread but it threw me an error saying it must be run on the main thread.
I will move the switch below the button so that it doesnt look like its part of the form but thats besides the point.
Thanks in advance!
答案1
得分: 1
使用以下代码:
switch_us_dark_mode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isPressed()) {
// 开启了切换
Log.i("tag", "切换为暗黑模式");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
editor.putString("theme", "dark");
} else {
// 关闭了切换
Log.i("tag", "切换为明亮模式");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
editor.putString("theme", "light");
}
}
});
使用 "buttonView.isPressed()" 替代 isChecked。希望它可以工作。
如果以上方法失败,您还可以使用 Checkbox,并将其设置为可绘制,但仅在以上方法不起作用时使用。
英文:
Use below code:
switch_us_dark_mode.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (buttonView.isPressed()) {
// The toggle is enabled
Log.i("tag", "Hit Dark");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
editor.putString("theme", "dark");
} else {
// The toggle is disable
Log.i("tag", "Hit Light");
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
editor.putString("theme", "light");
}
}
});
Use "buttonView.isPressed()" instead of isChecked. Hope it works
You can also use the Checkbox instead of Switch and set the drawable to it, but only if above fails.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论