Android应用内语言切换实现
转http://my.oschina.net/jack1900/blog/290694
在一款应用里面有个设置页面,其中有一项“语言切换”功能,就是在使用APP的过程中,动态的去切换APP的语言,具体参照微信设置页面。起先想来是很简单的事情嘛,不就是个简单的资源国际化嘛,strings.xml资源文件一整还不给OK?真正动起手来就真不是这么一回事了,国际化是没问题,但是怎样能更改所有页面的文字资源呢,这是一个问题。下面介绍下网上找的几个方案。
一、API欺骗
烧制到手机中的android.jar包含了Android所需的各种类与方法;而供开发者使用的android.jar只是其中的一部分。API欺骗是指在应用中去模拟未公开的类和方法让应用编译通过并生成APK,然而在应用实际运行中调用的却仍是烧制到手机中真实的android.jar。
二、使用Java反射机制
IActivityManager与ActivityManagerNative都是非公开类,使用Java反射去调用其中的方法。
但是这个弊端是显而易见的,上述两种方法都是去更改系统的语言的类型,功能和你去设置页面去设置语言类型的效果一样。发现对当前系统设置了新的Locale后,不单自己的应用语系改变了,系统所有的应用语系都改变了。这肯定是不合理的。或许你会说,在退出app的时候,大不了再把语言给改回来呗。可是在Android里面,杀死APP的原因多种多样,有内存杀,有用户强杀,有滑动侧滑杀,你又能如何判断APP是何时被Kill的呢。下面介绍下我的解决方案,实现的效果还是不错的。依旧Github代码地址在最下方,有兴趣的同学可以去下载看下。
第一步、使用Android开放的api更改Configuration,同时把语言类型保存下来
第二步、Destroy当前页面,重新绘制才能更改语言类型
如果你的页面不是首页,你调用上述代码只会更新当前页面,压在栈中的Activity依然不会更新界面。比如微信设置语言成功后,会自动跳转到首页,当然首页的内容也是更新后的,它的实现方式也很简单,与我们上面写的大同小异。就是监听设置成功后,destroy所有存在的页面,再跳转到首页。这时你的app就能满足了上面的需求了,可是别急还有第三步。
第三步、只要你的应用不彻底从Dalvik或者ART中彻底移除,上述都没问题。但是如果重新开机,或者强制杀掉应用,再次启动,就恢复到以前的语言类型了。
这会我们就用到第一步中保存的语言的类型了,在所有页面的基类BaseActivity中,每次都调用下语言设置的方法,这样就能把页面给强制设置成业务需求的语言类型了。OK,这个问题就完满解决了,要为你的APP添加这个功能的话,对代码的改动是非常小的。下面附上代码地址:https://github.com/JackCho/SwitchLanguageDemo