为满足Android App更广泛的使用度,通常会包含多语言版本,根据用户的选择,自动加载相应的语言包,并更新界面显示。该过程主要可划分为两步:

1)加入不同语言对应的资源包;

2)根据选择切换界面语言的显示。

语言资源包

任何保存在工程res下的资源文件都可以根据语言保存在不同的资源包中,这里仅以res下的strings.xml为例。

默认的Android工程在res/values下会包含strings.xml,该文件没有语言的适配功能,在没有指定显示语言环境时默认使用,当然也可使用于任何语言环境下;如果设定了语言环境,当某string在对应的语言包下没有相应的注释,则也会在默认的string.xml中查找对应注释。

如何新建简体中文和英文的语言包?

在values下选择新建资源文件Valus Resource files

微信图片_20181014165842.png

file name中输入strings.xml,在下方的available qualifiers中选择Locale,其作用是为当前的xml文件加入属性。区域属性包含语言代码和区域代码,可选范围分别列举在Language和Specific Region Only两列表下,选择后即为该语言包设置标签,在语言环境匹配时加载对应的语言包。

如何获取当前的语言环境?

Android中通过configuration获取当前语言设置,根据版本不同有如下两种方式:

1)API >= 17时已废弃

Locale locale = context.getResources().getConfiguration().locale;

2)在 API >= 17 的版本上可以使用

LocaleList localeList = context.getResources().getConfiguration().getLocales();

Locale locale = localeList.get(0);

之后可通过

String language = locale.getLanguage();

String country = locale.getCountry();

分别获得当前的语言设置和区域设置。

如何设置语言包?

根据上面获取当前语言设置的过程可以看出,设置语言的过程是作用于context的。

更新configuration的过程如下:

@TargetApi(Build.VERSION_CODES.N)

private static Context updateResources(Context context, String language) {

Resources resources = context.getResources();

Locale locale = AppLanguageUtils.getLocaleByLanguage(language);

Configuration configuration = resources.getConfiguration();

configuration.setLocale(locale);

configuration.setLocales(new LocaleList(locale));

return context.createConfigurationContext(configuration);

}

如何改变语言环境?

更新语言包,更改configuration的设置后,需要重新启动activity才能正确加载。

Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);

//TargetActiviy的launchMode为singleInstance时,CurrentActivity和TargetActvity不在一个Task栈

//需要完全终止当前应用后再重启,才能正确加载新的设置

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

startActivity(intent);

如果希望重新加载当前activity,使用recreate()方法即可。

语言设置的过程需要作用于每一个activity。创建activity的基类BaseActivity,并在其中重写如下方法可以免去在每个activity中都重复相同的方法描述。

@Override

protected void attachBaseContext(Context newBase)

{

super.attachBaseContext(updateResources(context, language));

}

activity启动前会先进这里加载对应的语言包,之后执行onCreate。

android 切换语言不起作用,Android 语言切换实例及踩坑相关推荐

  1. C语言文件缓冲区作用,C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲...

    //文件结构体FILE的理解以及缓冲区再讲 #include #include //要点:文件结构 //struct _iobuf { // char *_ptr; ------当前缓冲区内容指针 / ...

  2. c语言fun的作用,c语言fun函数有什么作用

    c语言fun函数有什么作用 c语言fun函数的作用是被主函数所调用,来定义一个函数或方法,这样在引用时可以用fun表示,比如[int fun(int x,int y)]. c语言fun函数的作用是: ...

  3. %2d在c语言中什么作用,C语言中的 %2d是什么意思

    修饰符格式说明.意义M%md以宽度m输出整型数,不足m时,左补空格0m%0md以宽度m输出整型数,不足m时,左补零m,n%m.nf以宽度m输出实型小数,小数位为n位例如:设i=123,a=12.345 ...

  4. android:ellipsize=end 不起作用,android:ellipsize=end 失效或者 相关的Bug

    其实这文章有点傻逼. 相关的问题 TextView android:ellipsize="end"超出一个字符时不显示-的解决 http://www.pocketdigi.com/ ...

  5. c语言 const常量作用,C语言 const常量讲解

    //const的本质 //const本质上是伪常量,无法用于数组初始化以及全局变量初始化 //原因在于const仅仅限定变量无法直接赋值,但是却可以通过指针间接赋值 //例如局部常量在栈区,而不在静态 ...

  6. android 多语言不起作用,Android本地化语言环境不起作用,所有区域代码都存在问题...

    我需要将除瑞士之类的子语言环境添加到我的应用程序中,而不是普通的德语. 我找到的德语资源文件夹的语言环境扩展名为de.所以我的文件夹名为"values-de".这很好. 然后我添加 ...

  7. step在c语言中什么作用,C语言step-by-step(二)(数据类型)

    第2章:数据类型 先介绍一些计算机指令简单的知识: 大家都知道我们的计算机有硬盘.有内存这两样东西,都属于存储器,但是硬盘属于在掉电后不丢失信息,一般我们把资料存放在硬盘:然而内存掉电会丢掉所有信息, ...

  8. c语言中英文的作用,C语言中英文对照.doc

    C语言中英文对照 一File(文件) Load 加载 F3 Pick(选择) Alt-F3 New 新文件 Save 存盘 F2 Write To 写文件 Directory 目录 Change Di ...

  9. android下raw目录的作用,Android 之 assets目录和raw目录

    Android 中存在assets目录和raw目录,它们既有相似之处又有所不同. 一.共同点: 目录下的资源会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式. 二.区别 1. ...

  10. c语言算术运算的作用,C语言算术运算符和算术表达式

    C语言算术运算符和算术表达式 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.下面和大家分享一些C语言算术运算符和算术表达式,一起来看看吧! 一. 基本的算术运算符 (1)+(加法运算 ...

最新文章

  1. maven快照版本和发布版本
  2. jMeter Thread group 对应的 constant timer
  3. Java学习之SpringBoot整合SSM Demo
  4. 自兴人工智能---认识python语言的基础数据类型和操作
  5. sv_labs学习笔记——sv_lab4(System Verilog)
  6. NLP学习—24.Pre-trained Word Embedding—ELMO、GPT、Bert
  7. 计算器计算经纬距离_经纬距离计算器下载_经纬距离计算器官方下载-太平洋下载中心...
  8. html设置字体样式罗马,罗马字体英文
  9. cad计算机配置要求,CAD对电脑配置有什么要求?CAD对电脑配置有什么要求?
  10. 非root用户安装或升级CUDA和CUDNN版本
  11. CTFT、DTFT、DFT、FFT
  12. 智能电子后视镜MFC01-LCD通用版 使用说明与简单故障排查
  13. 多个域名指向一个ip
  14. UEFI标准应用程序模块--SMBIOS的读写
  15. 视频转码编辑工具:Compressor for Mac(4.5.4)
  16. 关于跨境支付,你了解多少
  17. Ubuntu 16.04通过Trickle限制某个软件的下载/上传速度
  18. ue4挂载其他工程生成的pak,打开level
  19. 多线程threading模块用法 -《狗嗨默示录》-
  20. 我们距离真正的移动办公,还有多远

热门文章

  1. openCV视频教程
  2. CRMEB Min电商系统商城源码 v4.3.2
  3. SPSS多元线性回归及逐步回归学习笔记
  4. arcgis软件环境安装
  5. CISP 考试资源分享
  6. Visio连接线相关问题
  7. visio如何粘附或取消粘附连接线
  8. 关于sentaurus使用感
  9. python中安装pip_Python中如何安装pip-百度经验
  10. 计算机打印机副机无法打印,局域网打印机无法打印怎么办 局域网打印机无法打印解决方法...