Android应用内部切换语言
2016-07-22 14:24
260 查看
Android 应用 内部切换语言的需求其实挺多的,比如支付宝,微信等。
当用户在界面上更改语言后会调用此方法进行变更语言。当然你可以保存起来,以便下次启动时恢复。
出现此问题的原因参考Android源码分析-资源加载机制此博文,引用如下片段
根据上述代码中资源的请求机制,再加上ResourcesManager采用单例模式,这样就保证了不同的ContextImpl访问的是同一套资源,注意,这里说的同一套资源未必是同一个资源,因为资源可能位于不同的目录,但它一定是我们的应用的资源,或许这样来描述更准确,在设备参数和显示参数不变的情况下,不同的ContextImpl访问到的是同一份资源。设备参数不变是指手机的屏幕和android版本不变,显示参数不变是指手机的分辨率和横竖屏状态。也就是说,尽管Application、Activity、Service都有自己的ContextImpl,并且每个ContextImpl都有自己的mResources成员,但是由于它们的mResources成员都来自于唯一的ResourcesManager实例,所以它们看似不同的mResources其实都指向的是同一块内存(C语言的概念),因此,它们的mResources都是同一个对象(在设备参数和显示参数不变的情况下)。在横竖屏切换的情况下且应用中为横竖屏状态提供了不同的资源,处在横屏状态下的ContextImpl和处在竖屏状态下的ContextImpl访问的资源不是同一个资源对象。
实现代码
其实这个代码网上一搜就出来了public class LanguageUtils{ public void setLanguage(Context context, String lan){ Resources res = context.getResources(); Locale current = new Locale(lan); Configuration conf = res.getConfiguration(); conf.locale = current; res.updateConfiguration(conf, res.getDisplayMetrics()); } }
当用户在界面上更改语言后会调用此方法进行变更语言。当然你可以保存起来,以便下次启动时恢复。
问题
应用在使用过程中可能恢复“设置”中本地语言的界面出现此问题的原因参考Android源码分析-资源加载机制此博文,引用如下片段
根据上述代码中资源的请求机制,再加上ResourcesManager采用单例模式,这样就保证了不同的ContextImpl访问的是同一套资源,注意,这里说的同一套资源未必是同一个资源,因为资源可能位于不同的目录,但它一定是我们的应用的资源,或许这样来描述更准确,在设备参数和显示参数不变的情况下,不同的ContextImpl访问到的是同一份资源。设备参数不变是指手机的屏幕和android版本不变,显示参数不变是指手机的分辨率和横竖屏状态。也就是说,尽管Application、Activity、Service都有自己的ContextImpl,并且每个ContextImpl都有自己的mResources成员,但是由于它们的mResources成员都来自于唯一的ResourcesManager实例,所以它们看似不同的mResources其实都指向的是同一块内存(C语言的概念),因此,它们的mResources都是同一个对象(在设备参数和显示参数不变的情况下)。在横竖屏切换的情况下且应用中为横竖屏状态提供了不同的资源,处在横屏状态下的ContextImpl和处在竖屏状态下的ContextImpl访问的资源不是同一个资源对象。
说明参数不变的情况使用同一份资源,出现上面的问题是参数发生变化了,也就是在setLanguage中设置的Locale又恢复到默认状态了。 解决此问题即在Activity.onCreate()、onConfigurationChanged(Configuration newConfig)中再次调用setLanguage()方法进行设置,保证参数变更时,Resources.configuration处于同步状态的Locale. 2. 关于调用setLanguage()方法后界面并未发生变化 调用此方法并不会触发onCreate()方法或者界面刷新,所以需要自己维护Activity栈。 解决:变更语言后,打开MainActivity(主界面),然后结束非栈顶的所有Activity。
相关文章推荐
- Android Studio launch ddms error
- Android的Handler、MessageQueue、Runnable和Looper
- android控件详解----TextView
- Android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- 我对广播的一下理解
- Android-百度地图之方向感应和模式更改
- Android序列化
- Android进阶自定义控件之滑动开关
- Android Studio 错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
- 对DButils
- Android studio sources for android api 23 platform not found
- android打开系统图库终极适配
- android应用去掉标题栏的方法
- Android Studio signed apk 引入so包
- Android代码的组织结构
- Android开发中SVN的使用
- Android自定义view详解
- android MediaPlayer详解
- IntentService与Service的区别以及使用场景
- 广播——Android应用程序发送广播(sendBroadcast)的过程分析