是否可以获取特殊配置的颜色资源的颜色?



例如,假设我们在值/颜色中有一个颜色资源.xml如下:

<color name="navigation_drawer_overlay">#66000000</color>

以及值夜/颜色中的相同颜色资源.xml如下:

<color name="navigation_drawer_overlay">#33AAAAAA</color>

默认情况下,当我在 java 源代码中获取此颜色时:

ContextCompat.getColor(getContext(), R.color.navigation_drawer_overlay);

它将基于自动配置检测进行获取。

但是我想获取特殊配置(在我的情况下值-夜间版本(

有没有办法强制获取我想要配置的资源?

我可以强制获取夜间颜色资源吗?

您可以尝试以下解决方法:

1(在颜色中设置两种颜色.xml如下所示:

<color name="navigation_drawer_overlay_day">#66000000</color>
<color name="navigation_drawer_overlay_night">#33AAAAAA</color>

2(在课堂内部,当你需要改变颜色时,这样做:

switch (AppCompatDelegate.getDefaultNightMode()) {
case AppCompatDelegate.MODE_NIGHT_YES:
ContextCompat.getColor(getContext(), R.color.navigation_drawer_overlay_night);
break;
case AppCompatDelegate.MODE_NIGHT_NO:
ContextCompat.getColor(getContext(), R.color.navigation_drawer_overlay_day);
break;
}

几年后,有一个解决方案:

private static Context getNightContext(Context fromContext) {
Configuration configuration = new Configuration(fromContext.getResources().getConfiguration());
configuration.uiMode = UI_MODE_NIGHT_YES; // set night mode
return fromContext.createConfigurationContext(configuration);
}
// try to get the color from nightContext

基于 @user3094449 的答案

但经过一些修改

夜间模式的正确常数是UI_MODE_NIGHT_YES,而不是NIGHT_MODE_YES。

private static Context getNightContext(Context fromContext) {
Configuration configuration = new Configuration(fromContext.getResources().getConfiguration());
configuration.uiMode = Configuration.UI_MODE_NIGHT_YES; // set night mode
return fromContext.createConfigurationContext(configuration);
}

最新更新