谷歌发布了自支持库v26发布以来的官方字体资源处理: https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html
但是,看起来我无法为字体资源文件夹添加国家限定符。
我的应用程序有3种语言:英语,繁体中文和简体中文。
我尝试用res
这样命名我的字体文件夹:
font
font-zh
font-zh_CN
(我也试过font-zh-CN
)
(请注意,zh
是语言,而CN
是国家/地区。有更多信息背景 - 在中国我们都使用“中文”,但有简体中文和繁体中文;而且,香港和台湾都使用繁体中文,但我们使用繁体中文的方式有点不同。最重要的是,字体有繁体中文和简体中文的单独文件,因为它们的区别很大。形状。)
但我无法建立这个项目。 Android Studio一直告诉我font-zh_CN
(或font-zh-CN
)是无效的资源目录名称。
我的values-zh_CN
文件夹(也不是values-zh-CN
)也不会发生这种情况。
问题:
对于相同语言但不同国家/地区,如何使用不同的字体,使用自API 26以来的新官方方法?
答案 0 :(得分:2)
资源文件夹名称的模式在表2中定义: https://developer.android.com/guide/topics/resources/providing-resources.html#Alternative%20Resources
具体来说,试试:
font-zh-rCN
答案 1 :(得分:1)
正如@SeanBarbeau指出的那样,正确的模式应该是{language}-r{country}
。
在我提出这个问题之前,我肯定已经尝试了4个月,但当时,我认为还有其他因素导致它失败。
因此,我想在此处添加更多信息,以期帮助更多陷入困境的人。
简短回答是将上下文包装在onAttachBaseContext
的{{1}}中
具体来说,我遵循了指南here。
但为了让一切顺利,你需要确定两件事:
这个帖子已经回答了,并且;
我相信这是我4个月前错过的。
当时我对语言环境的格式了解不多
我想我一直在使用BaseActivity
或new Locale("zh-CN")
或new Locale("zh_CN")
之类的内容。所有这些都是错的!
指定区域设置的最佳方法是使用内置常量,例如new Locale("zh-rCN")
。
如果查看此常量,则调用方法Locale.SIMPLIFIED_CHINESE
虽然createConstant("zh", "CN")
是私有方法,但我认为它应该与createConstant()
相同;但我仍然建议使用常数。
因此,最后,您的new Locale("zh", "CN")
应如下所示:
ContextWrapper
这里的要点是直接将public static Context wrap(Context context, Locale locale) {
Configuration config = context.getResources().getConfiguration();
if (locale == null) locale = Locale.ENGLISH; //Your default locale
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
config.setLocale(locale);
} else {
config.locale = locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
return context.createConfigurationContext(config);
} else {
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
return context;
}
}
对象传递给包装器,,这与使用Locale
。
虽然首选项(可能只是一个String)转换为Locale对象取决于您的实现。