• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android项目开发填坑记

Android项目开发填坑记

作者:获取系统语言(兼容7.0) - 他叫自己Mr.张 字体:[增加 减小] 来源:互联网 时间:2017-07-22

获取系统语言(兼容7.0) - 他叫自己Mr.张通过本文主要向大家介绍了android等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

如果移动端访问不佳,请访问–> 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-CN

0 >1> zh-CN
1 >1> hi-IN
2 >1> en-US
3 >1> zh-HK

0 >2> zh-CN
1 >2> hi-IN
2 >2> en-US
3 >2> zh-HK

0 >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

App 国际化:values,values-zh

结果是:

en-US

0 >1> en-US
1 >1> hi-IN
2 >1> zh-CN
3 >1> zh-HK

0 >2> en-US
1 >2> hi-IN
2 >2> zh-CN
3 >2> zh-HK

0 >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.html

PS:你可以通过下面的方式和我联系

  • 微博:cafeting
  • Github: likfe
  • CSDN:他叫自己Mr.张
</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-26安卓中Paint类和Canvas类的方法汇总,安卓中canvas
  • 2017-05-26Yarn上运行spark-1.6.0
  • 2017-05-26电商常用的正则表达式,字符串,地址操作,电商正则表达式
  • 2017-05-26nginx设置泛域名解析的https证书过程
  • 2017-05-26Neo4j入门点滴(一):Cypher
  • 2017-05-26《Android Studio实用指南》12.18 文本搜索工具
  • 2017-05-26Android--activity切换时的动画,android--activity
  • 2017-05-26手机APP创建桌面快捷方式,app创建快捷方式
  • 2017-05-26Android 获取当前网速质量调整网络请求
  • 2017-05-26使用flume+kafka+storm构建实时日志分析系统

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android 6.0 Phone"通话显示"查询流程
    • Volley源码解析
    • Android之RecyclerView(二),androidrecyclerview
    • Android学习笔记-ImageView(图像视图),android-imageview
    • AndroidTV版(乐视超3 X55)root,将自己的软件设置为开机自启、系统软件,卸载系统应用等问题总结,androidtvx55
    • [android] 与PHP的session进行交互demo,androidsession
    • 【转载】ReactiveX 的理念和特点,转载reactivex理念
    • 我的android学习经历,android学习经历
    • Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决,studio-opencv
    • android:px,dp(dip),sp的区别

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有