Android动态更换应用语言
在开发应用过程中,对于一些有多国语言支撑的项目而言,就需要做到动态国际化的需求,当然Android应用基本上都是默认读取手机的当前语言环境,然后默认获取相对应的语言资源strings。
难免项目会需要应用到以上的需求,那么我们就来满足这个需求。
首先:准备两个语言资源,两个Activity类,两个layout布局,两个语言strings资源:
第一个界面我放置两个按钮,一个用来动态切换语言,一个跳转打下一个界面,强调一点:
更新了语言资源之后,一定要刷新界面
语言引用用@string/xxx
接下来就是代码了::::::
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
refreshLanguage();
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this, SecondActivity.class));
}
});
简单的两个按钮,一个更换语言,一个跳转,真正重要的就在refreshLanguage()这个方法中了。
//刷新显示配置
public void refreshLanguage() {
String str = getLanguage(); //得到目前点击的语言环境 "zh" "en" 等
Resources localResources = context.getResources(); // 创建Resources对象
//如果本地语言不等于现在的语言环境
if (!localResources.getConfiguration().locale.getLanguage().equals(str)) {
// 得到一个 配置Configuration对象
Configuration localConfiguration = getUpdateLocalConfig(str);
//得到自定义资源的对象
DisplayMetrics localDisplayMetrics = localResources.getDisplayMetrics();
//资源对象更新配置文件
localResources.updateConfiguration(localConfiguration, localDisplayMetrics);
}
}
/**
* 创建Configuration
*
* @param language
* @return
*/
public Configuration getUpdateLocalConfig(String language) {
//得到本地资源配置对象
Configuration localConfiguration = context.getResources().getConfiguration();
//得到最新的语言环境Locale
Locale localLocale = getLocale(language);
//资源配置对象设置语言环境
localConfiguration.locale = localLocale;
return localConfiguration;
}
//创建新的Locale并覆盖原Locale
public Locale getLocale(String language) {
//根据传进来的语言 生成一个语言环境Locale
Locale localeLocale = new Locale(language);
//将传进来的语言环境变成本地默认的,进行更换前的准备,返回这个语言环境Locale
Locale.setDefault(localeLocale);
return localeLocale;
}
//得到App配置文件目前的语言
public String getLanguage() {
if (config) {
//获得资源Resources对象
Resources resources = getApplicationContext().getResources();
//得到返回当前对象的语言"en""zh"等
defaultLanguage = resources.getConfiguration().locale.getLanguage();
config = false;
return "en";
} else {
Resources resources = getApplicationContext().getResources();
defaultLanguage = resources.getConfiguration().locale.getLanguage();
config = true;
return "zh";
}
}
通过上述的代码,写的注释已经真的真的真的非常详细了吧。
总结:
1.获取已经更改的语言Language字符串,例如“en”“zh”等
2.判断项目目前的语言环境和动态得到的语言环境字符串是否相等
3.不相等,则获取一个Configuration对象(Configuration对象又通过Locale对象获得,Locale对象又需要根据当前language来获取相对应的对象)
4.得到自定义资源对象DisplayMetrics
5.资源对象更新配置文件
6.完成上述行云流水般的操作,再跳转下个界面,字符资源就变成英文了。