最近项目上线语言国际化功能,即实现多语言,主要是简体中文,繁体,英语,韩语,俄语,日语几种语言,俄语恶心的我想哭,简单的一个词超级长一串,弄的我基本上每个页面都调整了下布局,否则丑的哭...
关于如何切换多语言我就不说了,网上很多方法(注意适配7.0,因为7.0上的切换语言的方法接口有变化,已被坑)。在我调整了布局后还挺高兴,因为大工程结束了啊,然而还是太年轻。测试时发现视频播放界面全屏切换后多语言设置失效了,之前app设置的日语又变成了系统默认的简体中文。
当屏幕旋转(全屏切换)失效,就设置了activity的
android:configChanges="locale|orientation|keyboardHidden|screenSize"
还是无效,网络上查找资料,发现解决方案如下:
1.新建AppContext,继承自Application,重写onConfigurationChanged()方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
LogUtils.e("language test");
super.onConfigurationChanged(newConfig);
LanguageUtil.setLocale(this);
}
- LanguageUtil.setLocale(this)方法是设置当前app的语言,比如app选择的日语,就把语言设置为日语
public static Context setLocale(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return createConfigurationResources(context);
} else {
setConfiguration();
return context;
}
}
3.AndroidManifest.xml文件中application节点下设置name为AppContext,设置android:configChanges
<application
android:name=".AppContext"
android:configChanges="orientation|screenSize|locale"
屏幕旋转时会触发onConfigurationChanged(Configuration newConfig)方法时。这个newConfig取的是系统的,这就是为什么语言会切换到系统语言的原因。所以在这里我们再次设置下locale就能够了。
或许会疑惑为什么7.0上的设备屏幕旋转后没有出现这个问题呢,那是因为前面提到过的7.0的设备切换语言接口发生了变化,是针对于每个activity或者说context对象生效,而7.0以下的设备是全局的application对象设置语言切换生效
/**
*7.0切换语言方法
**/
@TargetApi(Build.VERSION_CODES.N)
private static Context createConfigurationResources(Context context) {
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
//getLanguageLocale()获取当前设置的语言
Locale locale =getLanguageLocale();
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}
/**
* 7.0以下设置语言切换方法
*/
public void setConfiguration() {
//getLanguageLocale()获取当前设置的语言
Locale targetLocale = getLanguageLocale();
//mContext是全局的application对象
Configuration configuration = mContext.getResources().getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(targetLocale);
} else {
configuration.locale = targetLocale;
}
Resources resources = mContext.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
resources.updateConfiguration(configuration, dm);//语言更换生效的代码!
}
好了,记录下这个问题,坑了我浪费大半天时间...