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
中,我设置了以下这些:
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0-beta01'
有人能告诉我我做错了什么吗?
PS :我已经看过以下问题了,它没有回答这个问题,
发布于 2019-10-10 14:11:12
我也面临着类似的夜晚模式的问题。一些屏幕是好的,但另一些保持固定的主题。最后,我发现我正在使用应用程序的上下文而不是当前的活动上下文实例化一些视图。由于某些原因,应用程序的上下文不跟踪此类信息。
因此,更新您的代码以使用current的活动上下文而不是应用程序上下文。
供其他用户参考。避免:
ContextCompat.getColor(getApplicationContext(), R.id.myColor)
和使用:
// 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)
}
发布于 2021-12-31 08:40:38
我遇到了与您类似的问题,我还发现问题的核心是应用程序没有类似于主题包装的活动。所以W0rmH0le的答案可以解决这个问题。但是对我来说,有很多代码不能获取一个活动或视图的上下文。所以我想为什么我们不创建一个单例上下文包装器nightMode主题。这是密码,对我来说很好。
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替换应用程序,您可以找到正确的颜色跟随夜间模式。
发布于 2022-03-05 10:22:07
应用程序上下文不了解当前主题或日夜,因此如果您从应用程序上下文中获得资源,您将获得默认应用程序主题中的资源。这个问题的解决方案是使用活动/片段上下文,但在某些情况下,您可能没有活动或片段,而且只具有应用程序上下文。我已经创建了一个上下文包装类来将昼夜主题添加到应用程序上下文中:
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...
}
这段代码已经过测试和工作.
https://stackoverflow.com/questions/58323212
复制相似问题