首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ContextCompat.getColor()忽略NightMode

ContextCompat.getColor()忽略NightMode
EN

Stack Overflow用户
提问于 2019-10-10 12:45:07
回答 4查看 2.2K关注 0票数 18

TL,DR;

ContextCompat.getColor()不使用夜色(values-night/colors.xml),尽管它应该在启用夜间模式时使用。

这里的问题是:

大家好,

因此,我正在为我的安卓应用程序实现一个黑暗主题,我称之为启用它:AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

我在values/colors.xml中设置了颜色,在values-night/colors.xml中设置了深色版本。颜色的变化取决于nightMode,但是:

当我使用ContextCompat.getColor(getApplicationContext(), R.id.myColor)时,它使用的是普通颜色(values/colors.xml),而不是夜色(values-night/colors.xml)。

在我的build.gradle中,我设置了以下这些:

代码语言:javascript
运行
复制
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0-beta01'

有人能告诉我我做错了什么吗?

PS :我已经看过以下问题了,它没有回答这个问题,

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-10 14:11:12

我也面临着类似的夜晚模式的问题。一些屏幕是好的,但另一些保持固定的主题。最后,我发现我正在使用应用程序的上下文而不是当前的活动上下文实例化一些视图。由于某些原因,应用程序的上下文不跟踪此类信息。

因此,更新您的代码以使用current的活动上下文而不是应用程序上下文。

供其他用户参考。避免:

代码语言:javascript
运行
复制
ContextCompat.getColor(getApplicationContext(), R.id.myColor)

和使用:

代码语言:javascript
运行
复制
// In a Activity
ContextCompat.getColor(this, R.id.myColor)

// In a View
ContextCompat.getColor(getContext(), R.id.myColor)

// In a Fragment (check against null because getContext can trigger a NPE
Context context = getContext()
if (context != null) {
    ContextCompat.getColor(context, R.id.myColor)
}
票数 27
EN

Stack Overflow用户

发布于 2021-12-31 08:40:38

我遇到了与您类似的问题,我还发现问题的核心是应用程序没有类似于主题包装的活动。所以W0rmH0le的答案可以解决这个问题。但是对我来说,有很多代码不能获取一个活动或视图的上下文。所以我想为什么我们不创建一个单例上下文包装器nightMode主题。这是密码,对我来说很好。

代码语言:javascript
运行
复制
Resources res = getApplication().getResources();
Configuration configuration = new Configuration(res.getConfiguration());
int nightNode = AppCompatDelegate.getDefaultNightMode();
if (nightNode == AppCompatDelegate.MODE_NIGHT_NO) {
    configuration.uiMode = Configuration.UI_MODE_NIGHT_NO | (res.getConfiguration().uiMode & ~Configuration.UI_MODE_NIGHT_MASK);
} else if (nightNode == AppCompatDelegate.MODE_NIGHT_YES) {
    configuration.uiMode = Configuration.UI_MODE_NIGHT_YES| (res.getConfiguration().uiMode & ~Configuration.UI_MODE_NIGHT_MASK);
} else {
    configuration.uiMode = res.getConfiguration().uiMode;
}
mThemeContext = getApplication().createConfigurationContext(configuration);

然后,您可以使用mThemeContext替换应用程序,您可以找到正确的颜色跟随夜间模式。

票数 2
EN

Stack Overflow用户

发布于 2022-03-05 10:22:07

应用程序上下文不了解当前主题或日夜,因此如果您从应用程序上下文中获得资源,您将获得默认应用程序主题中的资源。这个问题的解决方案是使用活动/片段上下文,但在某些情况下,您可能没有活动或片段,而且只具有应用程序上下文。我已经创建了一个上下文包装类来将昼夜主题添加到应用程序上下文中:

代码语言:javascript
运行
复制
import android.content.Context
import android.content.res.Configuration
import android.content.res.Resources
import androidx.annotation.ColorRes
import androidx.annotation.DrawableRes
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.content.ContextCompat

class ThemedContext(application: Context) {

    private val themedContext: Context

    init {
        val res: Resources = application.resources
        val configuration = Configuration(res.configuration)
        val filter = res.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK.inv()

        configuration.uiMode = when (AppCompatDelegate.getDefaultNightMode()) {
            AppCompatDelegate.MODE_NIGHT_NO -> Configuration.UI_MODE_NIGHT_NO or filter
            AppCompatDelegate.MODE_NIGHT_YES -> Configuration.UI_MODE_NIGHT_YES or filter
            else -> res.configuration.uiMode
        }

        themedContext = application.createConfigurationContext(configuration)
    }

    fun getColor(@ColorRes id: Int) = ContextCompat.getColor(themedContext, id)
    fun getDrawable(@DrawableRes id: Int) = ContextCompat.getDrawable(themedContext, id)
    //todo Add other getter methods as needed...
}

这段代码已经过测试和工作.

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58323212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档