
一、需求
有时候应用需要在内部切换语言但又不影响系统的语言,比如是应用现在是中文的,系统语言也是中文的,我把应用的切换成英文显示后系统语言还是中文的,系统语言切换后也不会被改变,还有就是有些机的系统是被改造精简过的,比如有些国产机的系统的语言就被精简剩中文和英文。支付宝、微信、top Story都有在应用内部设置语言切换这样的功能。
二、实现效果
先看看实现效果吧。
三、实现
(一)添加多种语言的资源文件夹及文件
我这默认是英语再添加了个俄文(Google翻译的)和中文。
values/strings.xml
<resources> <string name="app_name">SwitchLanguage</string> <string name="helloworld">Hello World!</string> <string name="language">Eng</string> <string name="english">English</string> <string name="chinese">中文</string> <string name="russian">русский</string> <string name="secondact">Second Activity</string> </resources>
values-ru/strings.xml
<resources> <string name="app_name">Переключение язык</string> <string name="helloworld">привет мир!</string> <string name="language">русский</string> <string name="secondact">второй активность</string> </resources>
values-zh/strings.xml
<resources> <string name="app_name">切换语言</string> <string name="helloworld">你好 世界!</string> <string name="language">中文</string> <string name="secondact">第二屏</string> </resources>
(二)布局文件
activity_main.xml
默认标题栏的文字是切换语言后是不会被改变的,使用Toobar替换掉就可以了。
<?xml version="1.0" enCoding="utf-8"?> <linearLayout androID:ID="@+ID/activity_main" xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:tools="http://schemas.androID.com/tools" androID:layout_wIDth="match_parent" androID:layout_height="match_parent" androID:orIEntation="vertical" tools:context="com.ce.switchlanguage.MainActivity" xmlns:app="http://schemas.androID.com/apk/res-auto"> <androID.support.design.Widget.AppbarLayout androID:layout_height="wrap_content" androID:layout_wIDth="match_parent" androID:theme="@style/Apptheme.AppbarOverlay"> <androID.support.v7.Widget.Toolbar androID:ID="@+ID/toolbar" androID:layout_wIDth="match_parent" androID:layout_height="?attr/actionbarSize" androID:background="?attr/colorPrimary" app:popuptheme="@style/Apptheme.PopupOverlay" app:title="@string/app_name"/> </androID.support.design.Widget.AppbarLayout> <TextVIEw androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="@string/helloworld"/> <button androID:ID="@+ID/change" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:layout_gravity="center" androID:text="@string/language"/> </linearLayout>
styles.xml
设置语言后需要重启下activity,启动会有个效果,使用windowdisablePrevIEw屏蔽掉它。
<resources> <style name="Apptheme" parent="theme.AppCompat.light.DarkActionbar"> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <item name="windowActionbar">false</item> <item name="windowNoTitle">true</item> <item name="androID:windowdisablePrevIEw">true</item> </style> <style name="Apptheme.AppbarOverlay" parent="themeOverlay.AppCompat.Dark.Actionbar"/> <style name="Apptheme.PopupOverlay" parent="themeOverlay.AppCompat.Dark"/> </resources>
main_menu.xml
<?xml version="1.0" enCoding="utf-8"?> <menu xmlns:androID="http://schemas.androID.com/apk/res/androID" xmlns:app="http://schemas.androID.com/apk/res-auto"> <item androID:ID="@+ID/chinese" androID:title="@string/chinese" app:showAsAction="never" /> <item androID:ID="@+ID/english" androID:title="@string/english" app:showAsAction="never" /> <item androID:ID="@+ID/russian" androID:title="@string/russian" app:showAsAction="never" /> </menu>
(三)LocaleUtils
package com.ce.switchlanguage; import androID.content.Context; import androID.content.SharedPreferences; import androID.content.res.Configuration; import androID.os.Build; import androID.util.displayMetrics; import com.Google.gson.Gson; import java.util.Locale; public class LocaleUtils { /** * 中文 */ public static final Locale LOCALE_CHInesE = Locale.CHInesE; /** * 英文 */ public static final Locale LOCALE_ENGliSH = Locale.ENGliSH; /** * 俄文 */ public static final Locale LOCALE_RUSSIAN = new Locale("ru"); /** * 保存SharedPreferences的文件名 */ private static final String LOCALE_file = "LOCALE_file"; /** * 保存Locale的key */ private static final String LOCALE_KEY = "LOCALE_KEY"; /** * 获取用户设置的Locale * @param pContext Context * @return Locale */ public static Locale getUserLocale(Context pContext) { SharedPreferences _SpLocale = pContext.getSharedPreferences(LOCALE_file,Context.MODE_PRIVATE); String _LocaleJson = _SpLocale.getString(LOCALE_KEY,""); return JsonTolocale(_LocaleJson); } /** * 获取当前的Locale * @param pContext Context * @return Locale */ public static Locale getCurrentLocale(Context pContext) { Locale _Locale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0有多语言设置获取顶部的语言 _Locale = pContext.getResources().getConfiguration().getLocales().get(0); } else { _Locale = pContext.getResources().getConfiguration().locale; } return _Locale; } /** * 保存用户设置的Locale * @param pContext Context * @param pUserLocale Locale */ public static voID saveUserLocale(Context pContext,Locale pUserLocale) { SharedPreferences _SpLocal=pContext.getSharedPreferences(LOCALE_file,Context.MODE_PRIVATE); SharedPreferences.Editor _Edit=_SpLocal.edit(); String _LocaleJson = localetoJson(pUserLocale); _Edit.putString(LOCALE_KEY,_LocaleJson); _Edit.apply(); } /** * Locale转成Json * @param pUserLocale UserLocale * @return Json String */ private static String localetoJson(Locale pUserLocale) { Gson _Gson = new Gson(); return _Gson.toJson(pUserLocale); } /** * Json转成Locale * @param pLocaleJson LocaleJson * @return Locale */ private static Locale JsonTolocale(String pLocaleJson) { Gson _Gson = new Gson(); return _Gson.fromJson(pLocaleJson,Locale.class); } /** * 更新Locale * @param pContext Context * @param pNewUserLocale New User Locale */ public static voID updateLocale(Context pContext,Locale pNewUserLocale) { if (needUpdateLocale(pContext,pNewUserLocale)) { Configuration _Configuration = pContext.getResources().getConfiguration(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { _Configuration.setLocale(pNewUserLocale); } else { _Configuration.locale =pNewUserLocale; } displayMetrics _displayMetrics = pContext.getResources().getdisplayMetrics(); pContext.getResources().updateConfiguration(_Configuration,_displayMetrics); saveUserLocale(pContext,pNewUserLocale); } } /** * 判断需不需要更新 * @param pContext Context * @param pNewUserLocale New User Locale * @return true / false */ public static boolean needUpdateLocale(Context pContext,Locale pNewUserLocale) { return pNewUserLocale != null && !getCurrentLocale(pContext).equals(pNewUserLocale); } } Locale工具类,这里我用SharedPreferences来保存所设置的Locale,Locale是实现了Serializable的。
(四)Activity
package com.ce.switchlanguage; import androID.content.Intent; import androID.os.Bundle; import androID.support.v7.app.AppCompatActivity; import androID.support.v7.Widget.Toolbar; import androID.vIEw.Menu; import androID.vIEw.MenuItem; public class MainActivity extends AppCompatActivity { @OverrIDe protected voID onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentVIEw(R.layout.activity_main); Toolbar _Toolbar =(Toolbar) findVIEwByID(R.ID.toolbar); setSupportActionbar(_Toolbar); } @OverrIDe public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu,menu); return true; } @OverrIDe public boolean onoptionsItemSelected(MenuItem item) { int _ItemID=item.getItemID(); switch (_ItemID) { case R.ID.chinese: if (LocaleUtils.needUpdateLocale(this,LocaleUtils.LOCALE_CHInesE)) { LocaleUtils.updateLocale(this,LocaleUtils.LOCALE_CHInesE); restartAct(); } break; case R.ID.english: if (LocaleUtils.needUpdateLocale(this,LocaleUtils.LOCALE_ENGliSH)) { LocaleUtils.updateLocale(this,LocaleUtils.LOCALE_ENGliSH); restartAct(); } break; case R.ID.russian: if (LocaleUtils.needUpdateLocale(this,LocaleUtils.LOCALE_RUSSIAN)) { LocaleUtils.updateLocale(this,LocaleUtils.LOCALE_RUSSIAN); restartAct(); } } return true; } /** * 重启当前Activity */ private voID restartAct() { finish(); Intent _Intent = new Intent(this,MainActivity.class); startActivity(_Intent); //清除Activity退出和进入的动画 overrIDePendingTransition(0,0); } } 这里只有一个Activity所以切换的时候重启下当前Activity就好了,栈里还有其他Activity的自己再处理吧。
(五)Application
package com.ce.switchlanguage; import androID.app.Application; import androID.content.res.Configuration; import androID.os.Build; import java.util.Locale; public class MyApplication extends Application { @OverrIDe public voID onCreate() { super.onCreate(); Locale _UserLocale=LocaleUtils.getUserLocale(this); LocaleUtils.updateLocale(this,_UserLocale); } @OverrIDe public voID onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Locale _UserLocale=LocaleUtils.getUserLocale(this); //系统语言改变了应用保持之前设置的语言 if (_UserLocale != null) { Locale.setDefault(_UserLocale); Configuration _Configuration = new Configuration(newConfig); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { _Configuration.setLocale(_UserLocale); } else { _Configuration.locale =_UserLocale; } getResources().updateConfiguration(_Configuration,getResources().getdisplayMetrics()); } } } 在Application onCreate的时候更新下,在系统语言改变的时候也要保持之前设置的语言不变。
源码地址:Android应用内置语言切换
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android实现应用内置语言切换功能全部内容,希望文章能够帮你解决Android实现应用内置语言切换功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)