例如,假设我们在值/颜色中有一个颜色资源.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);
}