前言:Android应用的开发不可能仅仅针对某一个国家或者区域使用,因此APP必须支持多种语言,为了实现这个特性,Android给出了一个解决方案,在res文件夹下通过values+语言编码来实现多国语言的支持(中间採用连字符号-连接)比如:values-es代表英文,在网上看过不少关于多语言切换的文章,但都没有达到自己的效果。

解决问题:
1、可同时在应用进入选择和内部切换
2、解决高版本切换语言不生效问题
3、解决切换闪屏、白屏问题
4、重启应用语言设置数据持久化

效果:

1、在项目res目录下新建需要的语言配置文件




这里新建了3种语言文字,需要其他语种的自行添加

语种 简称
中文(中国) values-zh-rCN
中文(台湾) values-zh-rTW
中文(香港) values-zh-rHK
英语(美国) values-en-rUS
英语(英国) values-en-rGB
英文(澳大利亚) values-en-rAU
英文(加拿大) values-en-rCA
英文(爱尔兰) values-en-rIE
英文(印度) values-en-rIN
英文(新西兰) values-zh-rHK
英文(新加坡) values-en-rNZ
英文(南非) values-en-rZA
阿拉伯文(埃及) values-ar-rEG
阿拉伯文(以色列) values-ar-rIL
保加利亚文 values-bg-rBG
加泰罗尼亚文 values-ca-rES
捷克文 values-cs-rCZ
丹麦文 values-da-rDK
德文(奥地利) values-de-rAT
德文(瑞士) values-de-rCH
德文(德国) values-de-rDE
德文(列支敦士登): values-de-rLI
希腊文 values-el-rGR
西班牙文(西班牙) values-es-rES
西班牙文(美国) values-es-rUS
芬兰文(芬兰) values-fi-rFI
法文(比利时) values-fr-rBE
法文(加拿大) values-fr-rCA
法文(瑞士) values-fr-rCH
法文(法国) values-fr-rFR
希伯来文) values-iw-rIL
印地文 values-hi-rIN
克罗里亚文 values-hr-rHR
匈牙利文 values-hu-rHU
印度尼西亚文 values-in-rID
意大利文(瑞士) values-it-rCH
意大利文(意大利) values-it-rIT
日文 values-ja-rJP
韩文 values-ko-rKR
立陶宛文 valueslt-rLT
拉脱维亚文 values-lv-rLV
挪威博克马尔文 values-nb-rNO
荷兰文(比利时) values-nl-BE
荷兰文(荷兰) values-nl-rNL
波兰文 values-pl-rPL
葡萄牙文(巴西) values-pt-rBR
葡萄牙文(葡萄牙) values-pt-rPT
罗马尼亚文 values-ro-rRO
俄文 values-ru-rRU
斯洛伐克文 values-sk-rSK
斯洛文尼亚文 values-sl-rSI
塞尔维亚文 values-sr-rRS
瑞典文 values-sv-rSE
泰文 values-zh-rHK
塔加洛文 values-th-rTH
土耳其文 values–r-rTR
乌克兰文 values-uk-rUA
越南文 values-vi-rVN

2、测试文字:
中文简体:

<string name="home1_title">首页</string>
<string name="home2_title">信息</string>
<string name="home3_title">系统</string>
<string name="home4_title">我的</string>
<string name="test_hint">安卓是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。</string>

中文繁体(4个标题换了因为简繁一致看不出效果):

<string name="home1_title">首頁</string>
<string name="home2_title">細膩</string>
<string name="home3_title">曉曦</string>
<string name="home4_title">訂單</string>
<string name="test_hint">安卓是一種基於Linux內核(不包含GNU元件)的自由及開放原始程式碼的作業系統。主要使用於移動設備,如智慧手機和平板電腦,由Google公司和開放手機聯盟領導及開發。Android作業系統最初由Andy Rubin開發,主要支援手機。2005年8月由Google收購注資。2007年11月,Google與84家硬體製造商、軟體發展商及電信營運商組建開放手機聯盟共同研發改良Android系統。隨後Google以Apache開源許可證的授權方式,發佈了Android的原始程式碼。</string>

英文:

<string name="home1_title">Home page</string>
<string name="home2_title">information</string>
<string name="home3_title">system</string>
<string name="home4_title">my</string>
<string name="test_hint">Android is a free and open source operating system based on the Linux kernel (which does not include GNU components). Primarily used on mobile devices such as smartphones and tablets, it is led and developed by Google and the open handset alliance. The Android operating system was originally developed by Andy Rubin and mainly supports mobile phones. It was acquired by Google in August 2005. In November 2007, Google formed an open handset alliance with 84 hardware manufacturers, software developers and telecom operators to develop and improve Android. Then Google released the source code for Android under the Apache open source license.</string>

3、LanguageUtil语言切换工具类:

/*** 功能描述:修改app内部的语言工具类*/
public class LanguageUtil {/*语言类型:* 此处支持3种语言类型,更多可以自行添加。* */private static final String ENGLISH = "en";private static final String CHINESE = "ch";private static final String TRADITIONAL_CHINESE = "zh_rTW";private static HashMap<String, Locale> languagesList = new HashMap<String, Locale>(3) {{put(ENGLISH, Locale.ENGLISH);put(CHINESE, Locale.CHINESE);put(TRADITIONAL_CHINESE, Locale.TRADITIONAL_CHINESE);}};/*** 修改语言** @param activity 上下文* @param language 例如修改为 英文传“en”,参考上文字符串常量* @param cls      要跳转的类(一般为入口类)*/public static void changeAppLanguage(Activity activity, String language, Class<?> cls) {Resources resources = activity.getResources();Configuration configuration = resources.getConfiguration();// app locale 默认简体中文Locale locale = getLocaleByLanguage(StringUtils.isEmpty(language) ? "zh" : language);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {configuration.setLocale(locale);} else {configuration.locale = locale;}DisplayMetrics dm = resources.getDisplayMetrics();resources.updateConfiguration(configuration, dm);LogUtils.e("设置的语言:" + language);//finish();// 重启appIntent intent = new Intent(activity, cls);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);activity.startActivity(intent);//加载动画//activity.overridePendingTransition(R.anim.anim_right_in, R.anim.anim_left_out);//activity.overridePendingTransition(0, 0);}/*** 获取指定语言的locale信息,如果指定语言不存在* 返回本机语言,如果本机语言不是语言集合中的一种,返回英语*/private static Locale getLocaleByLanguage(String language) {if (isContainsKeyLanguage(language)) {return languagesList.get(language);} else {Locale locale = Locale.getDefault();for (String key : languagesList.keySet()) {if (TextUtils.equals(languagesList.get(key).getLanguage(), locale.getLanguage())) {return locale;}}}return Locale.ENGLISH;}/*** 如果此映射包含指定键的映射关系,则返回 true*/private static boolean isContainsKeyLanguage(String language) {return languagesList.containsKey(language);}}

4、使用方法(自行添加3个按钮):

@OnClick({R.id.language1, R.id.language2, R.id.language3})public void onClick(View view) {switch (view.getId()) {case R.id.language1://中文简体showSaveLanguage("zh");break;case R.id.language2://中文繁体showSaveLanguage("zh_rTW");break;case R.id.language3://英文showSaveLanguage("en");break;}}/*** 保存设置的语言*/private void showSaveLanguage(String language){//设置的语言、重启的类一般为应用主入口(微信也是到首页)LanguageUtil.changeAppLanguage(this, language, MainActivity.class);//保存设置的语言SpUserUtils.putString(this, "language", language);}

5、SpUserUtils .class存储类

public class SpUserUtils {private static SharedPreferences sp;private static SharedPreferences getSp(Context context) {if (sp == null) {sp = context.getSharedPreferences("SpUtil", Context.MODE_PRIVATE);}return sp;}/*** 存入字符串** @param context 上下文* @param key     字符串的键* @param value   字符串的值*/public static void putString(Context context, String key, String value) {SharedPreferences preferences = getSp(context);//存入数据SharedPreferences.Editor editor = preferences.edit();editor.putString(key, value);editor.commit();}/*** 获取字符串** @param context 上下文* @param key     字符串的键* @return 得到的字符串*/public static String getString(Context context, String key) {SharedPreferences preferences = getSp(context);return preferences.getString(key, "");}/*** 清除String* @param context* @param key*/public static void clearString(Context context, String key) {SharedPreferences sp = getSp(context);SharedPreferences.Editor editor = sp.edit();editor.remove(key);editor.apply();
//        editor.clear();
//        editor.commit();}
}

6、解决应用重启后数据持久化问题:

/*** 引导界面*/
public class WelcomeActivity extends AppCompatActivity {//防止重复打开界面private static boolean ISFIRST = true;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_welcome);String language = SpUserUtils.getString(this, "language");if (ISFIRST) {ISFIRST = false;LanguageUtil.changeAppLanguage(this, language, WelcomeActivity.class);}Intent intent = new Intent(this, MainActivity.class);startActivity(intent);}

7、优化白屏问题:

<!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><!--禁用窗口的预览动画--><item name="android:windowDisablePreview">true</item></style>

Android多语言切换(兼容安卓9、10)相关推荐

  1. Android RadioButton 语言切换问题

    偶然间发现在不退出界面的情况下,RadioButton在语言切换时会出现不同步的问题:本来整个界面是英文的,这时如果把语言切换成中文,则会出现界面是其它的部分都已经正常的加载了,但是RadioButt ...

  2. android 系统语言切换,Android系统切换语言更新应用界面方法

    最近做的一个升级应用,在下载升级包的过程中又有一个toast类型的dialog悬浮在屏幕右上角,这个时候切换系统语言会出现问题. 当主屏幕为升级应用时,切换系统语言升级应用重启,而重启后并不能自动断点 ...

  3. Android 系统语言切换监听和设置

    最近项目上产品经理提了个需求,要求关闭语言国际化,不管手机系统设置那个国家的语言,都要显示汉语,好吧,既然有需求,那就做吧.但是项目中已经有英文的配置了,且是作为默认String提供的,这么多翻译好的 ...

  4. Android多语言切换,字体风格,简体转繁体

    DEMO地址:https://github.com/zhaopingfu/LanguageTypeface Android中多语言切换 在线简体中文转为繁体中文:http://www.vifo.com ...

  5. Android多语言切换/适配——以英语为例

    近期在做一个背单词APP来作为毕业设计,在app里面想设计一个切换语言为英语的功能,记录一下本次实现的效果以及步骤. 文章目录 实现效果 中文模式 英文模式 实现原理 实现步骤 1.创建相关的valu ...

  6. android多语言切换失效

    最近一个项目中用到了多语言,可是在有些语言切换失效,挣扎许久终于找到问题了. 这是切换语言的代码: public void changeAppLanguage(String key) {Configu ...

  7. android 切换语言重启应用程序,Android 多语言切换无需重启APP的方式

    简述 当APP需要给提供多种语音供用户使用的时候,作为开发者的我们自然要涉及到多语言切换的开发,希望我提供的方式能给需要的小伙伴们一点思路,老规矩先上图. 效果如下,可能看起来会比较卡(不知道为啥黑屏 ...

  8. android系统语言切换及系统烧写默认语言设置

    Android 4.3 1 . 语言全局切换 重写Setting后需要全局切换语言(中英.中阿等),查看原生的Setting代码,抽出切换语言部分,具体实现如下: zh_CN,这是原始localeSt ...

  9. Android 中英文语言切换

    非常简便,只需替换一个文件再添加上去即可 strings和-zh文件链接:https://download.csdn.net/download/meixi_android/11367095 1.首先替 ...

最新文章

  1. 用于目标检测的半自动视频标注
  2. MSSQL-字符串分离与列记录合并成一行混合使用
  3. matlab impdt,实验1 基于Matlab的数字信号处理基本操作
  4. java 代码锁_Java中的Lock锁
  5. python注销代码_django用户注册、登录、注销和用户扩展的示例
  6. Android之使用SoundPool播放一小段音频,实现猜歌的功能
  7. poj 3211 Washing Clothes (01)
  8. 基础DNS服务 轮训与泛域名解析
  9. Web页面的生命周期函数
  10. sun end seven game losing streak
  11. nod32 update and id
  12. qq android qav,33 BK.QQAVManager 音视频管理
  13. 地理空间数据云下载的单波段合成及去黑边
  14. creo扫描选择多条链作为轨迹_Proe/Creo创建扭簧
  15. 40余位重磅嘉宾,320分钟巅峰对话,这8场主题圆桌藏着哪些时代密码?丨第二届算力大会...
  16. 关于触发器原理及选型参数
  17. 查找算法之斐波那契查找算法
  18. java bidi_Java Bidi isRightToLeft()用法及代码示例
  19. 主动降噪开发之四——多通道算法实现
  20. 按键精灵多语言自动截图

热门文章

  1. 蜜蜂路线图c语言思路,打蜜蜂(c语言)(Hit the bee (C language)).doc
  2. 2022年全球及中国公共关系(PR)工具行业头部企业市场占有率及排名调研报告
  3. 解决org.junit.runners.model.InvalidTestClassError: Invalid test class ‘xxx‘ 1. No runnable methods
  4. Python数据分析入门教程(更新中)
  5. POJ 3349.Snowflake Snow Snowflakes
  6. lenovo服务器换系统重装系统_联想电脑怎么重装系统步骤如下:联想怎么重装正版win10...
  7. 微信小程序ocr身份证扫描
  8. DHTMLX Diagram JavaScript/HTML5 Pro Library:5.0
  9. iOS开发者账号过期续费
  10. DeiT:Training data-efficient image transformers distillation through attention