Android应用内设置多语言,可随系统语言改变而改变,也可设置app为固定语言不受系统语言影响
转载请标明出处: 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为固定语言不受系统语言影响相关推荐
- Android应用内设置多语言
1.项目简介 最近项目中要加入多语言需求,涉及到的有中文简体,中文繁体,英语,西班牙语,泰语,印尼语,葡萄牙语.参考了Android应用内设置多语言,可随系统语言改变而改变,在此基础上做了修改,选择为 ...
- Android实现应用内语言切换,android 应用内切换 多国语言
微信中可以动态设置,apk的语言版本,最近尝试实现了这个功能. 我们知道,android本身就支持多国语言版本的. 不过这个语言的切换 依赖于系统的的语言设置,见图 也依赖apk本身values多国语 ...
- Android切换泰语,Android应用内切换语言
首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈. 最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先.实现了中文,英文,泰语的 ...
- android 应用内切换语言
一:创建不同语言的strings.xml 1.1 选中res,右键选择Android Resource Directory => Locale => >> 选择你需要的语言 1 ...
- Android应用内多进程分析和研究
正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行.但是如果需要将某些组件(如Service.A ...
- Android 应用内实现导航页面,接入百度SDK内置导航,高德SDK内置导航
1.首先到百度地图开放平台创建应用,获取应用AK http://lbsyun.baidu.com/apiconsole/key 2.到百度语言平台创建应用,获取Secret Key和语言APP ID ...
- Android应用内社区SDK技术架构浅析
Android应用内社区SDK技术架构浅析 图1为雪球财经自选界面,图2是雪球财经App内的社区,也就是动态页面. 一.以友盟微社区为例 简单来说,友盟的微社区就是一款帮助开发者在应用中快速搭建一个社 ...
- android 设置字体大小不随系统大小变化,App字体大小不随系统改变而改变
在 "设置" , "显示" , "字体大小" 里面我们可以设置系统字体大小 App界面字体,如果被修改之后,可能就达不到理想状态的效果,界面 ...
- android虚拟内置sd卡,Android: 浅论虚拟SD卡的实现
项目中使用分布式并发部署定时任务,多台跨jvm,按照常理逻辑每个jvm的定时任务会各自运行,这样就会存在问题,多台分布式jvm机器的应用服务同时干活,一个是加重服务负担虚拟sd卡是什么,另外一个是存在 ...
最新文章
- 2022-2028年中国橡胶板的制造行业发展战略规划及投资方向研究报告
- redis cluster集群选主
- 推荐几款vs2005的插件
- 修改freebsd的主机名
- 打印一个整数二进制表示中所有的奇数位和偶数位
- 实现点击按钮复制文本(Clipboard包)
- flutter: 根视图、根元素与根渲染
- ie的window.open 未指明的错误_错误还是违法——离开的原因之一
- ArcGIS Desktop 10.5 安装实录
- 真正优秀的人是如何度过假期的
- 第二节20181110
- iptraf使用心得——如何查看网络流量
- Nod32的内网升级方案
- MATLAB基本语法速成
- 数组输出c语言程序,C语言输出数组的三种方法
- 渗透测试 QA 收集
- 一万块内工作站型计算机配置,1.5万元i7-7700K用于图形工作站高端电脑配置推荐...
- 用html做祝福语朋友,祝福朋友工作顺利的祝福语
- InfoPath 2007/2010 Helper Tool
- PAT A1010 Radix (25 分)