知识就是力量,时间就是生命。这篇文章主要讲述Android 项目开发填坑记 - 获取系统语言(兼容7.0)相关的知识,希望能为你提供帮助。
如果移动端访问不佳,
请访问–>
Github版
关键词:
android7.0
、系统语言
、顺序不一致
获取系统当前语言是一个比较常用的功能,
在 Android 7.0 系统上旧函数获取到的当前系统语言并不正确,
或者说从 Android 7.0 起,
Android 系统语言的规则变了。
背景 下面是未适配 Android 7.0 的代码:
// 获取 Locale 的方式有二
Locale locale =
getResources().getConfiguration().locale;
Locale locale =
Locale.getDefault();
// 获取当前系统语言
locale.getLanguage();
由于仅仅根据
getLanguage()
无法全面的了解当前的系统语言信息,
比如简体中文和繁体中文的 Language 都是 zh
,
所以还需要 getCountry()
方法获取地区信息,
我们就能得到 zh-CN
和 zh-HK/zh-TW
。总结一下就是:
// 获取 Locale 的方式有二
Locale locale =
getResources().getConfiguration().locale;
Locale locale =
Locale.getDefault();
// 获取当前系统语言
String lang =
locale.getLanguage() +
"
-"
+
locale.getCountry();
但是, 在 Android 7.0 上:
getResources().getConfiguration().locale
被标记为 deprecated 了,
所以初步适配后是:
Locale locale;
if (Build.VERSION.SDK_INT >
=
Build.VERSION_CODES.N) {
locale =
getResources().getConfiguration().getLocales().get(0);
} else {
locale =
getResources().getConfiguration().locale;
}
//或者仅仅使用 locale =
Locale.getDefault();
不需要考虑接口 deprecated(弃用)问题
String lang =
locale.getLanguage() +
"
-"
+
locale.getCountry();
从 Android 7.0 起使用的
getResources().getConfiguration().getLocales()
返回的是一个 LocaleList
对象,
它包含 >
=
1
个 Locale,
内容项可由用户增删,
顺序可由用户调整。但是,
此接口返回的语言顺序和用户定义的顺序不一定一致!
测试语言顺序 原文地址: h ttp://blog.csdn.net/ys743276112/article/details/71547134
测试核心代码:
Locale locale =
Locale.getDefault();
MLog.e(locale.getLanguage() +
"
-"
+
locale.getCountry());
if (Build.VERSION.SDK_INT >
=
Build.VERSION_CODES.N) {
LocaleList localeList =
getResources().getConfiguration().getLocales();
for (int i =
0;
i <
localeList.size();
i+
+
) {
MLog.e(i +
"
>
1>
"
+
localeList.get(i).getLanguage() +
"
-"
+
localeList.get(i).getCountry());
}LocaleList localeList2 =
LocaleList.getAdjustedDefault();
for (int i =
0;
i <
localeList2.size();
i+
+
) {
MLog.e(i +
"
>
2>
"
+
localeList2.get(i).getLanguage() +
"
-"
+
localeList2.get(i).getCountry());
}LocaleList localeList3 =
LocaleList.getDefault();
for (int i =
0;
i <
localeList3.size();
i+
+
) {
MLog.e(i +
"
>
3>
"
+
localeList3.get(i).getLanguage() +
"
-"
+
localeList3.get(i).getCountry());
}LocaleList localeList4 =
LocaleList.getEmptyLocaleList();
for (int i =
0;
i <
localeList4.size();
i+
+
) {
MLog.e(i +
"
>
4>
"
+
localeList4.get(i).getLanguage() +
"
-"
+
localeList4.get(i).getCountry());
}
}
第一次测试
测试手机: Nubia Z9 mini, Android 7.1, Mokee Rom
手机系统语言顺序:
hi-IN,zh-CN,en-US,zh-HK
App 国际化:
values,values-zh
(
values 里的 string 为英文,
values-zh 里的 string 为中文)
结果是:
zh-CN0 >
1>
zh-CN
1 >
1>
hi-IN
2 >
1>
en-US
3 >
1>
zh-HK0 >
2>
zh-CN
1 >
2>
hi-IN
2 >
2>
en-US
3 >
2>
zh-HK0 >
3>
hi-IN
1 >
3>
zh-CN
2 >
3>
en-US
3 >
3>
zh-HK
并且 App 当前显示的文字是中文。
第二次测试
测试手机: Nubia Z9 mini, Android 7.1, Mokee Rom
手机系统语言顺序:
hi-IN,en-US,zh-CN,zh-HK
【Android 项目开发填坑记 - 获取系统语言(兼容7.0)】App 国际化:
values,values-zh
结果是:
en-US0 >
1>
en-US
1 >
1>
hi-IN
2 >
1>
zh-CN
3 >
1>
zh-HK0 >
2>
en-US
1 >
2>
hi-IN
2 >
2>
zh-CN
3 >
2>
zh-HK0 >
3>
hi-IN
1 >
3>
en-US
2 >
3>
zh-CN
3 >
3>
zh-HK
并且 App 当前显示的文字是英文。
结论 从 Android 7.0 开始, 系统语言支持多个, 可手动排序, 系统根据 App 本身支持的语言和手机出厂设置的语言等因素来调整 App 本身的默认语言。
要获取系统为 App 调整后的默认语言:
Locale locale =
Locale.getDefault();
//Locale.getDefault() 和 LocaleList.getAdjustedDefault().get(0) 同等效果,
还不需要考虑版本问题,
推荐直接使用
String language =
locale.getLanguage() +
"
-"
+
locale.getCountry();
要获取系统真实首选语言:
Locale locale;
if (Build.VERSION.SDK_INT >
=
Build.VERSION_CODES.N) {
locale =
LocaleList.getDefault().get(0);
} else locale =
Locale.getDefault();
String language =
locale.getLanguage() +
"
-"
+
locale.getCountry();
参考资料: https://developer.android.com/reference/java/util/Locale.htmlPS: 你可以通过下面的方式和我联系
- 微博: cafeting
- Github: likfe
- CSDN: 他叫自己Mr.张
推荐阅读
- nltp APP-分析买家评论的评分-高频词(二维关系)
- Android6.0运行时权限管理
- Android 自定义控件之继承ViewGroup创建新容器
- Application.idle方法
- android的控件
- Android binder学习一(主要概念)
- uiautomator android 官网翻译
- Android 软键盘弹出时布局内指定内容上移实现及问题解决
- NiceFish的ERROR in AppModule is not an NgModule问题