主动切换暗黑主题发现的问题

主动切换暗黑主题发现的问题

相关代码:

//检测是否是浅色主题
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;
}

这种方式是跟随系统当前主题的

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
LovelyChubby 2021-05-07 19:32:07
  1. 黑暗主题的检测。

    HiViewUtil#lightMode我们是直接使用全局的Application对象来操作了,当APP配置变更后,可能会出现,我们使用的Application对象还是原来的那个,它的configration没有变,所以会出现一直是黑暗主题,一直返回false的情况。

      这个问题,我们在使用lightMode方法的时候,可以传递进去一个context. 不使用全局的Application对象了

      又或者,监听到configration变更后,我们让AppGlobals重新获取一下Application也行。




 2. GridItem  切换暗黑时变成白色的,白色主题又是黑色。

      按照下面代码改造

HiRes.getColor
实现方式全部改成
ContextCompat.getColor(context,resId)


  • 提问者 默小铭 #1

    第一点的,老师说的让AppGlobals重新获取一下Application是怎么实现了?,我们代码不是直接反射获取得嘛?

    ​@SuppressLint("PrivateApi")
    object AppGlobals {
    private var application: Application? = null
    fun get(): Application? {
    if (application == null) {
    try {
    application = Class.forName("android.app.ActivityThread")
    .getMethod("currentApplication")
    .invoke(null) as Application
    } catch (ex: Exception) {
    ex.printStackTrace()
    }
    }
    return application
    }
    }

    然后第二点,这个我自己实现了,也没问题,但是如果全改成这种写法,那么HiRes这个封装类就没啥意义了,所以我觉得还是觉得重新获取应该好点吧

    2021-05-08 00:07:23
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师