主动切换暗黑主题发现的问题
相关代码:
//检测是否是浅色主题
public static boolean lightMode() {
int mode = AppGlobals.INSTANCE.get().getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
return mode == Configuration.UI_MODE_NIGHT_NO;
}
//DebugTool 代码
@HiDebug(name = "打开/关闭暗黑模式", desc = "暗黑模式主动调用测试")
fun toggleTheme(context: Context) {
if (HiViewUtil.lightMode(context)) {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
} else {
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
}
这种写法在DebugTool使用,打印日志发现点击过一次后,就永远返回false,后面我试着直接用电子书的写法
相关代码:
//检测是否是浅色主题
public static boolean lightMode(Context context) {
int mode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
return mode == Configuration.UI_MODE_NIGHT_NO;
}
这样写就能正常切换暗黑主题了,但是又发现了几个问题
相关代码:
//GridItem
//切换暗黑时变成白色的,白色主题又是黑色的
gridView.setBackgroundColor(HiRes.getColor(R.color.color_white))
//还有HiSliderView的Attrsparse
private val TEXT_COLOR_NORMAL = HiRes.getColor(R.color.color_666)//Color.parseColor("#666666")
private val TEXT_COLOR_SELECT = HiRes.getColor(R.color.color_127)//Color.parseColor("#DD3127")
private val BG_COLOR_NORMAL = HiRes.getColor(R.color.color_8f9)//Color.parseColor("#F7F8F9")
private val BG_COLOR_SELECT = HiRes.getColor(R.color.color_white)//Color.parseColor("#ffffff")
//按老师视频改成HiRes这种方式,也出现了一样的问题,然后自己试着改了下
gridView.setBackgroundColor(HiRes.getColor(R.color.color_white)) 改成
gridView.setBackgroundColor(ContextCompat.getColor(parent.context,R.color.color_white))
就可以了
所以我感觉是不是
AppGlobals.INSTANCE.get() 这种获取全局上下文,还有我们的HiRes做暗黑模式适配这个问题应该怎么改??有点没头绪
多验证了几次,还发现
//检测是否是浅色主题
public static boolean lightMode() {
int mode = AppGlobals.INSTANCE.get().getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
return mode == Configuration.UI_MODE_NIGHT_NO;
}
这种方式是跟随系统当前主题的
16
收起
正在回答 回答被采纳积分+1
1回答
LovelyChubby
2021-05-07 19:32:07
黑暗主题的检测。
HiViewUtil#lightMode我们是直接使用全局的Application对象来操作了,当APP配置变更后,可能会出现,我们使用的Application对象还是原来的那个,它的configration没有变,所以会出现一直是黑暗主题,一直返回false的情况。
这个问题,我们在使用lightMode方法的时候,可以传递进去一个context. 不使用全局的Application对象了
又或者,监听到configration变更后,我们让AppGlobals重新获取一下Application也行。
2. GridItem 切换暗黑时变成白色的,白色主题又是黑色。
按照下面代码改造
HiRes.getColor
实现方式全部改成
ContextCompat.getColor(context,resId)
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星