如何将语言环境(带国家/地区)添加到字体资源(支持库v26)?

时间:2017-11-02 02:39:03

标签: android locale android-resources android-fonts

谷歌发布了自支持库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以来的新官方方法?

2 个答案:

答案 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

但为了让一切顺利,你需要确定两件事:

(1)您的字体资源位于正确限定的文件夹中;

这个帖子已经回答了,并且;

(2)您将上下文包装在正确的区域设置

我相信这是我4个月前错过的。

当时我对语言环境的格式了解不多 我想我一直在使用BaseActivitynew 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对象取决于您的实现。