Android 获取系统语言(兼容7.0)
转载连接:http://likfe.com/2017/05/10/android-sys-language/
前言
获取系统当前语言是一个比较常用的功能,在 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 locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
locale = getResources().getConfiguration().getLocales().get(0);
} else {
locale = getResources().getConfiguration().locale;
}
//获取语言的正确姿势:
String lang = locale.getLanguage() + "-" + locale.getCountry();
从 Android 7.0 起使用的getResources().getConfiguration().getLocales() 返回的是一个 LocaleList 对象,它包含 >=1 个 Locale,内容项可由用户增删,顺序可由用户调整。但是,此接口返回的语言顺序和用户定义的顺序不一定一致!
测试语言顺序
测试核心代码:
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();
Android 获取系统语言(兼容7.0)的更多相关文章
- Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921,本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...
- Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0下面)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921.本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...
- 关于Android Studio升级到2.0后和Gradle插件不兼容的问题
今天升级AS到2.0后,用AS在真机上调试,发现报了如下错误: This version of Android Studio is incompatible with the Gradle Plugi ...
- Android Material Design 兼容库的使用
Android Material Design 兼容库的使用 mecury 前言:近来学习了Android Material Design 兼容库,为了把这个弄懂,才有了这篇博客,这里先推荐两篇博客: ...
- 【原】webapp开发中兼容Android4.0以下版本的css hack
话说现在的手机型号越来越多,主要还是android和ios这2个巨头称霸了江湖,而他们自带的浏览器内核是webkit,那对于做移动网页开发的同事来说,一般只要做好webkit内核浏览器的展现效果就行了 ...
- SpUtil多样加密存储,兼容android9.0
代码地址如下:http://www.demodashi.com/demo/15058.html 前言 在android系统不断升级的过程中,Sharepreferences存储出现多中问题,其中有些是 ...
- 下载安装APK(兼容Android7.0)
我们使用手机的时候经常会看到应用程序提示升级,大部分应用内部都需要实现升级提醒和应用程序文件(APK文件)下载. 一般写法都差不多,比如在启动app的时候,通过api接口获得服务器最新的版本号,然后和 ...
- Android消息传递之EventBus 3.0使用详解
前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...
- 请各位帮帮忙:Android LBS应用——CityExplorer (v1.0) 调研
Hello哇各位亲!! 请各位帮帮忙:Android LBS应用——CityExplorer(V1.0)调研 嗯,这个事情是这样的,要填一个调查问卷,但是问卷中部分问题是关于这个叫做CityExplo ...
随机推荐
- JVM中强引用,弱引用,软引用和幽灵引用的代码
上代码: public class ReferenceTest { public static void main(String[] args) { //test1();//软引用 //test2() ...
- 趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别
从头讲讲编码的故事.那么就让我们找个草堆坐下,先抽口烟,看看夜晚天空上的银河,然后想一想要从哪里开始讲起.嗯,也许这样开始比较好…… 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...
- C# 获取所有对象的字符串表示一ToString方法
应用程序开发过程中经常需要获取对象的字符串表示.Object类中定义了一个ToString的虚方法.所以在任何类型的实例上都能调用该方法. C#中几乎所有的类型都派生自Object,所以如果当前类型没 ...
- 我的Git教程 之 解决 git clone后无代码
解决 git clone 后无代码 前言:这个教程只适用于像我一样大致理解Git的原理,但是不太记得住Git命令的同学使用.所以具体原理只会提一下,具体可以参见Pro Git. 在另一篇 简明的教程 ...
- 使用Svn的版本号[转载]
1. 生成一个名为autover的项目 注意项目的Properties文件夹下有一个名为AssemblyInfo.cs的文件,autover程序的版本号就写在它里面. 2. 创建模板文件 在Windo ...
- Touch事件传递机制 Android
Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...
- Java堆外内存之突破JVM枷锁
对于有Java开发经验的朋友都知道,Java中不需要手动的申请和释放内存,JVM会自动进行垃圾回收:而使用的内存是由JVM控制的. 那么,什么时机会进行垃圾回收,如何避免过度频繁的垃圾回收?如果JVM ...
- 「每日一码」a&b赋值问题
每日一码 将每天看到的优秀的代码或者特别的实现,记录下来 a&b赋值问题 2019-2-18 var a = {n: 1}; var b = a; a.x = a = {n: 2}; Q&am ...
- nginx 代理之修改header 的HOST,实现代理转代理
现有一个需求,需要从nginx跳转到k8s的traefik代理上,从而实现服务的访问,用于测试.直接修改proxy_set_header的HOST,修改为traefuk代理的域名,proxy_pass ...
- Netty 解码器抽象父类 ByteToMessageDecoder 源码解析
前言 Netty 的解码器有很多种,比如基于长度的,基于分割符的,私有协议的.但是,总体的思路都是一致的. 拆包思路:当数据满足了 解码条件时,将其拆开.放到数组.然后发送到业务 handler 处理 ...