Android 实现应用内语言切换(包括不重启应用方式)
一、前言
对于一个移动应用,可能不仅仅是面向一个国家的用户,所以多语言国际化是移动应用开发中比较常见的一个功能;正常实现多语言国际化,我们只需要在资源目录下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); } 123456789
这里的language和country我们可以在程序中查看Locale这个类来查看各个语言对应的语言和国家
(3)使用步骤(2)中的切换,并不能立即生效,我们切换的语言和国家保存到到本地,可以使用SharedPreference,然后需要重启应用,并且在启动页的onCreate方法中,setContetnView之前从SharedPreferences中取出保存的语言和国家,然后再调用上面的changeLanguage方法设置一下即可;
调用changeLanguage切换语言之后,保存切换的语言和国家
SPUtil.put(Constant.CURRENT_LANGUAGE, language); SPUtil.put(Constant.CURRENT_COUNTRY, country); 12
要注意在启动页的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); 123
然后重启应用,就能生效
Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName()); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); System.exit(0); 1234
三、如何不重启应用使得语言切换生效
上面步骤中在要想使得语言切换生效,需要重启应用;微信Android版本,切换语言也是重启了应用,从语言设置界面回到了微信主界面;但是重启应用毕竟体验不好
如何不重启应用也能实现语言切换;
实现方式:
我们可以定义一个BaseActivity,所有的Activity继承自BaseActivity,然后切换语言的操作放到BaseActivtiy中,点击切换语言,通知BaseActivity执行切换语言的操作,然后BaseActivity需要调用recreate(),实际就是切换语言之后,重建所有的Activity,使得
语言切换生效;当然从SharedPreferences中取出保存的语言国家设置这一步也放到
BaseActivtiy中,在BaseActivity中onCreate方法中setContentView之前执行即可;
public abstract class BaseActivity extends AppCompatActivity r { protected Activity mActivity; @Override protected 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(); @Override protected 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(); } }
1234567891011121314151617181920212223242526272829303132333435363738这里我们提一下Activtiy的recreate()方法,recreate()方法是让Activity销毁再重建的过程,Activity的生命周期变化是先onPause()–>onStop()–>onDestory()(销毁),然后onCreate()–>onStart()–>onResume()(重建)
以上就是应用内实现语言切换的方式;
相应的Demo地址:https://github.com/maqing-programmer/MultiLanguageDemo
欢迎扫码订阅公众号,公众号主要分享原创或转载移动开发技术文章,和广大移动开发者一起学习成长!
相关知识
Android移动应用开发教程①
android:configChanges='keyboardHidden
应用内支付服务(HMS)
移动应用开发
Android应用集成支付宝资源
探索移动应用开发之旅:从概念到实现
移动应用开发教程
移动应用开发和安卓移动应用开发区别
移动(应用)开发详解
移动商务应用开发
网址: Android 实现应用内语言切换(包括不重启应用方式) https://www.huajiangbk.com/newsview1212962.html
上一篇: MediaCodec seekt |
下一篇: Android碎片化问题, Go |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039