转载请标明出处: https://blog.csdn.net/m0_38074457/article/details/84993366,本文出自:【陈少华的博客】

一、效果图

https://github.com/hnsycsxhzcsh/MultiLanguage/blob/master/myres/multilanguage.gif

二、实现原理

1、Application的onCreate中初始化,根据本地sp保存的多语言信息来确定app中显示哪种语言

2、在设置界面选择对应语言,然后把语言信息保存到sp中,重启应用

三、实现代码

1、首先要有一个多语言方法类MultiLanguageUtil


import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.os.LocaleList;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import com.multilanguage.ConstantGlobal;
import java.util.Locale;/*** Created by HARRY on 2018/6/5 0005.*/public class MultiLanguageUtil {public static Context attachBaseContext(Context context) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {return createConfigurationResources(context);} else {setConfiguration(context);return context;}}/*** 设置语言** @param context*/public static void setConfiguration(Context context) {Locale appLocale = getAppLocale(context);//如果本地有语言信息,以本地为主,如果本地没有使用默认LocaleLocale locale = null;String spLanguage = SpUtil.getString(context, ConstantGlobal.LOCALE_LANGUAGE);String spCountry = SpUtil.getString(context, ConstantGlobal.LOCALE_COUNTRY);if (!TextUtils.isEmpty(spLanguage) && !TextUtils.isEmpty(spCountry)) {if (isSameLocal(appLocale, spLanguage, spCountry)) {locale = appLocale;} else {locale = new Locale(spLanguage, spCountry);}} else {locale = appLocale;}Configuration configuration = context.getResources().getConfiguration();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {configuration.setLocale(locale);} else {configuration.locale = locale;}Resources resources = context.getResources();DisplayMetrics dm = resources.getDisplayMetrics();resources.updateConfiguration(configuration, dm);//语言更换生效的代码!}@TargetApi(Build.VERSION_CODES.N)private static Context createConfigurationResources(Context context) {Resources resources = context.getResources();Configuration configuration = resources.getConfiguration();Locale appLocale = getAppLocale(context);//如果本地有语言信息,以本地为主,如果本地没有使用默认LocaleLocale locale = null;String spLanguage = SpUtil.getString(context, ConstantGlobal.LOCALE_LANGUAGE);String spCountry = SpUtil.getString(context, ConstantGlobal.LOCALE_COUNTRY);if (!TextUtils.isEmpty(spLanguage) && !TextUtils.isEmpty(spCountry)) {if (isSameLocal(appLocale, spLanguage, spCountry)) {locale = appLocale;} else {locale = new Locale(spLanguage, spCountry);}} else {locale = appLocale;}configuration.setLocale(locale);configuration.setLocales(new LocaleList(locale));return context.createConfigurationContext(configuration);}/*** 更改应用语言** @param* @param locale      语言地区* @param persistence 是否持久化*/public static void changeAppLanguage(Context context, Locale locale, boolean persistence) {Resources resources = context.getResources();DisplayMetrics metrics = resources.getDisplayMetrics();Configuration configuration = resources.getConfiguration();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {configuration.setLocale(locale);configuration.setLocales(new LocaleList(locale));context.createConfigurationContext(configuration);} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {configuration.setLocale(locale);} else {configuration.locale = locale;}resources.updateConfiguration(configuration, metrics);if (persistence) {saveLanguageSetting(context, locale);}}//保存多语言信息到sp中public static void saveLanguageSetting(Context context, Locale locale) {SpUtil.saveString(context, ConstantGlobal.LOCALE_LANGUAGE, locale.getLanguage());SpUtil.saveString(context, ConstantGlobal.LOCALE_COUNTRY, locale.getCountry());}//获取本地应用的实际的多语言信息public static Locale getAppLocale(Context context) {//获取应用语言Resources resources = context.getResources();Configuration configuration = resources.getConfiguration();Locale locale = null;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {locale = configuration.getLocales().get(0);} else {locale = configuration.locale;}return locale;}//判断sp中和app中的多语言信息是否相同public static boolean isSameWithSetting(Context context) {Locale locale = getAppLocale(context);String language = locale.getLanguage();String country = locale.getCountry();String sp_language = SpUtil.getString(ConstantGlobal.LOCALE_LANGUAGE);String sp_country = SpUtil.getString(ConstantGlobal.LOCALE_COUNTRY);if (language.equals(sp_language) && country.equals(sp_country)) {return true;} else {return false;}}public static boolean isSameLocal(Locale appLocale, String sp_language, String sp_country) {String appLanguage = appLocale.getLanguage();String appCountry = appLocale.getCountry();if (appLanguage.equals(sp_language) && appCountry.equals(sp_country)) {return true;} else {return false;}}
}

2、在应用的application中根据sp保存的多语言信息做初始化

最重要的是

1、attachBaseContext方法中的初始化,应用刚启动的时候此方法在onCreate前执行,当用户修改手机系统的默认语言时,也会调用attachBaseContext方法

2.onCreate中一定要加上registerActivityLifecycleCallbacks(callbacks);用来监听Activity页面如果不是sp中设定的语言的话,可以修改成对应sp中的语言


import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import com.multilanguage.utils.MultiLanguageUtil;
import com.multilanguage.utils.SpUtil;
import java.util.Locale;/*** Created by HARRY on 2018/12/13 0013.*/public class MultiLanguageApp extends Application {private static Context mAppContext;public static Context getContext() {return mAppContext;}@Overridepublic void onCreate() {super.onCreate();this.mAppContext = getApplicationContext();//初始化本地语言,这句话可以不要,因为在attachBaseContext中已经处理了
//        changeLanguage();//注册Activity生命周期监听回调,此部分一定加上,因为有些版本不加的话多语言切换不回来registerActivityLifecycleCallbacks(callbacks);}private void changeLanguage() {Locale newLocale = MultiLanguageUtil.getAppLocale(this);String appLanguage = newLocale.getLanguage();String appCountry = newLocale.getCountry();String spLanguage = SpUtil.getString(getApplicationContext(), ConstantGlobal.LOCALE_LANGUAGE);String spCountry = SpUtil.getString(getApplicationContext(), ConstantGlobal.LOCALE_COUNTRY);if (!TextUtils.isEmpty(spLanguage) && !TextUtils.isEmpty(spCountry)) {// 如果有一个不同if (!MultiLanguageUtil.isSameWithSetting(this)) {Locale locale = new Locale(spLanguage, spCountry);MultiLanguageUtil.changeAppLanguage(getApplicationContext(), locale, false);}}}ActivityLifecycleCallbacks callbacks = new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {String language = SpUtil.getString(getApplicationContext(), ConstantGlobal.LOCALE_LANGUAGE);String country = SpUtil.getString(getApplicationContext(), ConstantGlobal.LOCALE_COUNTRY);if (!TextUtils.isEmpty(language) && !TextUtils.isEmpty(country)) {//强制修改应用语言if (!MultiLanguageUtil.isSameWithSetting(activity)) {Locale locale = new Locale(language, country);MultiLanguageUtil.changeAppLanguage(activity, locale, false);
//                    activity.recreate();}}}@Overridepublic void onActivityStarted(Activity activity) {}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}//Activity 其它生命周期的回调};@Overrideprotected void attachBaseContext(Context base) {//系统语言等设置发生改变时会调用此方法,需要要重置app语言super.attachBaseContext(MultiLanguageUtil.attachBaseContext(base));}}

3、做语言切换时候调以下用方法

注意:我这里在设置好语言后做了应用重启,因为发现如果不重启,会出现有些页面多语言没有切换的情况

例如:设置简体中文时候调用changeLanguage("zh","CN"),其他语言参数可以其他地方查询

//修改应用内语言设置private void changeLanguage(String language, String area) {if (TextUtils.isEmpty(language) && TextUtils.isEmpty(area)) {//如果语言和地区都是空,那么跟随系统SpUtil.saveString(ConstantGlobal.LOCALE_LANGUAGE, "");SpUtil.saveString(ConstantGlobal.LOCALE_COUNTRY, "");} else {//不为空,那么修改app语言,并true是把语言信息保存到sp中,false是不保存到sp中Locale newLocale = new Locale(language, area);MultiLanguageUtil.changeAppLanguage(MainActivity.this, newLocale, true);MultiLanguageUtil.changeAppLanguage(MultiLanguageApp.getContext(), newLocale, true);}//重启app,这一步一定要加上,如果不重启app,可能打开新的页面显示的语言会不正确Intent intent = new Intent(MultiLanguageApp.getContext(), MainActivity.class);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);MultiLanguageApp.getContext().startActivity(intent);android.os.Process.killProcess(android.os.Process.myPid());}

备注:具体代码我放在了github上https://github.com/hnsycsxhzcsh/MultiLanguage,欢迎博客点赞支持,并在github右上角star支持!

Android应用内设置多语言,可随系统语言改变而改变,也可设置app为固定语言不受系统语言影响相关推荐

  1. Android应用内设置多语言

    1.项目简介 最近项目中要加入多语言需求,涉及到的有中文简体,中文繁体,英语,西班牙语,泰语,印尼语,葡萄牙语.参考了Android应用内设置多语言,可随系统语言改变而改变,在此基础上做了修改,选择为 ...

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

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

  3. Android切换泰语,Android应用内切换语言

    首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈. 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先.实现了中文,英文,泰语的 ...

  4. android 应用内切换语言

    一:创建不同语言的strings.xml 1.1 选中res,右键选择Android Resource Directory => Locale => >> 选择你需要的语言 1 ...

  5. Android应用内多进程分析和研究

    正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行.但是如果需要将某些组件(如Service.A ...

  6. Android 应用内实现导航页面,接入百度SDK内置导航,高德SDK内置导航

    1.首先到百度地图开放平台创建应用,获取应用AK http://lbsyun.baidu.com/apiconsole/key 2.到百度语言平台创建应用,获取Secret Key和语言APP ID ...

  7. Android应用内社区SDK技术架构浅析

    Android应用内社区SDK技术架构浅析 图1为雪球财经自选界面,图2是雪球财经App内的社区,也就是动态页面. 一.以友盟微社区为例 简单来说,友盟的微社区就是一款帮助开发者在应用中快速搭建一个社 ...

  8. android 设置字体大小不随系统大小变化,App字体大小不随系统改变而改变

    在 "设置" , "显示" , "字体大小" 里面我们可以设置系统字体大小 App界面字体,如果被修改之后,可能就达不到理想状态的效果,界面 ...

  9. android虚拟内置sd卡,Android: 浅论虚拟SD卡的实现

    项目中使用分布式并发部署定时任务,多台跨jvm,按照常理逻辑每个jvm的定时任务会各自运行,这样就会存在问题,多台分布式jvm机器的应用服务同时干活,一个是加重服务负担虚拟sd卡是什么,另外一个是存在 ...

最新文章

  1. 2022-2028年中国橡胶板的制造行业发展战略规划及投资方向研究报告
  2. redis cluster集群选主
  3. 推荐几款vs2005的插件
  4. 修改freebsd的主机名
  5. 打印一个整数二进制表示中所有的奇数位和偶数位
  6. 实现点击按钮复制文本(Clipboard包)
  7. flutter: 根视图、根元素与根渲染
  8. ie的window.open 未指明的错误_错误还是违法——离开的原因之一
  9. ArcGIS Desktop 10.5 安装实录
  10. 真正优秀的人是如何度过假期的
  11. 第二节20181110
  12. iptraf使用心得——如何查看网络流量
  13. Nod32的内网升级方案
  14. MATLAB基本语法速成
  15. 数组输出c语言程序,C语言输出数组的三种方法
  16. 渗透测试 QA 收集
  17. 一万块内工作站型计算机配置,1.5万元i7-7700K用于图形工作站高端电脑配置推荐...
  18. 用html做祝福语朋友,祝福朋友工作顺利的祝福语
  19. InfoPath 2007/2010 Helper Tool
  20. PAT A1010 Radix (25 分)

热门文章

  1. shopify二次开发 产品详情页面的开发一(结构布局)
  2. Kali渗透测试之四漏洞映射
  3. 祈求代码不出 Bug 该拜哪个“神仙”?
  4. 图片水印怎么去掉?图片水印去除方法
  5. python分割图片数字_python实现图片中文字分割效果
  6. 当电竞在亚运会绽放,玩家也从此有了信仰
  7. io.fabric8.docker-maven-plugin插件使用
  8. linux中ess33没有IP地址问题
  9. Java 选择视频文件对话窗口
  10. 20165218 我期望的师生关系