一、前言
对于一个移动应用,可能不仅仅是面向一个国家的用户,所以多语言国际化是移动应用开发中比较常见的一个功能;正常实现多语言国际化,我们只需要在资源目录下res/下创建需要支持的国家values目录,命名格式为values-语言,如values-zh(中文),values-en(英文) ,然后在values目录下放置对应的资源文件,如string.xml,arrays.xml即可;Android系统会根据系统设置的语言,自动选择你应用中对应的values-语言目录下的资源 ,没有找到对应的语言的values-语言目录,那就使用默认的values目录下的资源 ;

但是这种实现多语言的方式,是跟随系统语言设置,但是有的时候,我们希望在自己应用内实现语言切换,而不是跟随系统设置;

二、应用内实现多语言切换
应用内实现多语言切换的步骤如下:
(1) 首先和正常实现多语言国际化一样,提供对应语言的资源文件;

(2)然后通过如下方式进行语言切换;

  public static final void changeLanguage(Context context, String language, String country) {if (context == null || TextUtils.isEmpty(language)) {return;}Resources resources = context.getResources();Configuration config = resources.getConfiguration();config.locale = new Locale(language, country);resources.updateConfiguration(config, null);}

这里的language和country我们可以在程序中查看Locale这个类来查看各个语言对应的语言和国家

(3)使用步骤(2)中的切换,并不能立即生效,我们切换的语言和国家保存到到本地,可以使用SharedPreference,然后需要重启应用,并且在启动页的onCreate方法中,setContetnView之前从SharedPreferences中取出保存的语言和国家,然后再调用上面的changeLanguage方法设置一下即可;

调用changeLanguage切换语言之后,保存切换的语言和国家

SPUtil.put(Constant.CURRENT_LANGUAGE, language);
SPUtil.put(Constant.CURRENT_COUNTRY, country);

要注意在启动页的onCreate方法中setContentView之前,从SharedPreferences取出保存的语言国家,设置一下语言

String currentCountry = (String) SPUtil.get(Constant.CURRENT_COUNTRY, "CN");
String currentLanguage = (String) SPUtil.get(Constant.CURRENT_LANGUAGE, "zh");
LanguageUtil.changeLanguage(MainActivity.this, currentLanguage, currentCountry);

然后重启应用,就能生效

Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
System.exit(0);

三、如何不重启应用使得语言切换生效

上面步骤中在要想使得语言切换生效,需要重启应用;微信Android版本,切换语言也是重启了应用,从语言设置界面回到了微信主界面;但是重启应用毕竟体验不好
如何不重启应用也能实现语言切换;

实现方式:

我们可以定义一个BaseActivity,所有的Activity继承自BaseActivity,然后切换语言的操作放到BaseActivtiy中,点击切换语言,通知BaseActivity执行切换语言的操作,然后BaseActivity需要调用recreate(),实际就是切换语言之后,重建所有的Activity,使得
语言切换生效;当然从SharedPreferences中取出保存的语言国家设置这一步也放到
BaseActivtiy中,在BaseActivity中onCreate方法中setContentView之前执行即可;

public abstract class BaseActivity extends AppCompatActivity r {protected Activity mActivity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EventBus.getDefault().register(this);mActivity=this;setLanguage();setContentView(getContentViewId());}private void setLanguage() {String currentCountry = (String) SPUtil.get(Constant.CURRENT_COUNTRY, "CN");String currentLanguage = (String) SPUtil.get(Constant.CURRENT_LANGUAGE, "zh");LanguageUtil.changeLanguage(mActivity, currentLanguage, currentCountry);}/*** 获取布局Id** @return*/protected abstract int getContentViewId();@Overrideprotected void onDestroy() {super.onDestroy();EventBus.getDefault().unregister(this);}@Subscribe(threadMode = ThreadMode.MAIN)public void switchLanguageEvent(SwitchLanguageEvent event) {LanguageUtil.changeLanguage(mActivity, event.getLanguage(), event.getCountry());recreate();}}

这里我们提一下Activtiy的recreate()方法,recreate()方法是让Activity销毁再重建的过程,Activity的生命周期变化是先onPause()–>onStop()–>onDestory()(销毁),然后onCreate()–>onStart()–>onResume()(重建)

以上就是应用内实现语言切换的方式;

相应的Demo地址:https://github.com/maqing-programmer/MultiLanguageDemo


欢迎扫码订阅公众号,公众号主要分享原创或转载移动开发技术文章,和广大移动开发者一起学习成长!

Android 实现应用内语言切换(包括不重启应用方式)相关推荐

  1. Android实现应用内语言切换,android 应用内切换 多国语言

    微信中可以动态设置,apk的语言版本,最近尝试实现了这个功能. 我们知道,android本身就支持多国语言版本的. 不过这个语言的切换 依赖于系统的的语言设置,见图 也依赖apk本身values多国语 ...

  2. android的app语言无法切换,Android应用实现多语言切换

    关于Android应用实现多语言切换,有好几种办法,网上也搜到很多资料,这里有个简单有效的办法. 步骤如下: 在资源文件中新建一个文件夹values-en,在里面新建一个strings.xml,把默认 ...

  3. android locale app内设置,Android app应用多语言切换功能实现

    本文实例为大家分享了Android app应用实现多语言切换功能,供大家参考,具体内容如下 1.添加多语言文件在不同的 value 文件夹下(例如 value .value-en.values-zh- ...

  4. Android app应用多语言切换功能实现

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...

  5. Android 仿微信多语言切换

    目录 一.简介 二.效果预览 三.实现步骤 1.功能实现 2.配置多语言文件 四.MultiLanguageUtils分析 五.Demo地址 六.内容推荐 一.简介 我想搜到这篇文章的朋友应该不需要我 ...

  6. iOS App内语言切换(国际化)

    想要实现App内的语言切换功能,那么首先要创建国际化语言文件,用于存储对应语言显示的文本. 1.创建国际化语言文件 command+N,选择Other里面的Empty文件. 我们将其命名为Locali ...

  7. iOS 程序内语言切换 -- 中英文切换

    随着时代的发展,应用程序相继出现了不同语言的版本方案,中文,英文,法文,韩文等等:想在应用程序中实现语言的自由切换,需要配置多个语言的文件,根据用户的动态选择获取不同语言文件下的语言文件,从而显示到界 ...

  8. iOS国际化APP内语言切换

    开发java的时候要求实现语言国际化,在java中用了i18来进行处理,移动端也可以进行处理: 方法可以有以下两种: 方案一:在原国际化版本的基础上做修改,在info.plist文件中新增key=&q ...

  9. Android 监听系统语言切换

    在Application中重写onConfigurationChanged @Override public void onConfigurationChanged(Configuration new ...

最新文章

  1. SQL server 数据库——T-SQL语句基础
  2. 安装kvm的服务器开启vnc连接其虚拟机
  3. elasticsearch 基本配置
  4. [国嵌笔记][036][关闭MMU和CACHE]
  5. Spring Security 教程
  6. 共享单车变“私有”、被毁、被盗:用户们都看不下去了,举报!
  7. post-commit hook failed (exit code 255) with no output 解决方案
  8. 微机实验报告7 定时/计数器应用实验
  9. windows7/windows10 虚拟显示器部署(Virtual monitor)
  10. ukey其他错误_关于税务UKey使用常见问题解答
  11. 技术分析:细说3D投影机技术原理
  12. 解锁pdf文件,删除pdf密码
  13. Oracle 锁表查询大全
  14. 从零开始,耗时两年,19岁小伙自制一块32位Risc-V处理器,可玩「贪吃蛇」
  15. isFinite() 如果参数是 NaN,正无穷大或者负无穷大,会返回 false,其他返回 true
  16. element-ui中的多层表单循环验证处理
  17. 无源物联网的定义、特点和优势
  18. Java操作redis遇到的问题
  19. 自动生成sitemap地图PHP代码
  20. Copyright ©的含义

热门文章

  1. centos vxlan
  2. 手把手教你基于HTML、CSS搭建我的相册(上)
  3. MySql中delimiter的用法
  4. 导弹发射各项参数计算涉及计算机应用,《计算机应用基础》复习题七(6页).doc...
  5. Shader山下(八)片段着色器
  6. 如何在 PDF Transformer+中进行FB2和EPUB转换设置
  7. 掌握华为手机拍照的六大要点,秒变专业摄影师,已拿小本本记录
  8. 我顺藤摸瓜端了色情网站的老窝,并劝他从良
  9. Word转换成PDF免费的两种方法,让你轻松解决问题!
  10. 计算机等级考试二级里哪个最好考?