最近项目要做到中英文切换的功能,调查了很久现在讲解及记录一下
首先android 支持多语言的操作,先要在你的res的values中新建一套你的语言系统的strings.xml
选中android resource file 并选择locale
这时可以选择你要的那个语言
以上是我们的准备工作,下面直接代码
public class LocaleUtils {
//中文
public static final Locale LOCALE_CHINESE = Locale.CHINESE;
/**
* 英文
*/
public static final Locale LOCALE_ENGLISH = Locale.ENGLISH;
/**
* 保存SharedPreferences的文件名
*/
private static final String LOCALE_FILE = "LOCALE_FILE";
/**
* 保存Locale的key
*/
private static final String LOCALE_KEY = "LOCALE_KEY";
/**
* 获取用户设置的Locale
*
* @param pContext Context
* @return Locale
*/
public static Locale getUserLocale(Context pContext) {
SharedPreferences _SpLocale = pContext.getSharedPreferences(LOCALE_FILE, Context.MODE_PRIVATE);
String _LocaleJson = _SpLocale.getString(LOCALE_KEY, "");
return jsonToLocale(_LocaleJson);
}
/**
* 获取当前的Locale
*
* @param pContext Context
* @return Locale
*/
public static Locale getCurrentLocale(Context pContext) {
Locale _Locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //7.0有多语言设置获取顶部的语言
_Locale = pContext.getResources().getConfiguration().getLocales().get(0);
} else {
_Locale = pContext.getResources().getConfiguration().locale;
}
return _Locale;
}
/**
* 保存用户设置的Locale
*
* @param pContext Context
* @param pUserLocale Locale
*/
public static void saveUserLocale(Context pContext, Locale pUserLocale) {
SharedPreferences _SpLocal = pContext.getSharedPreferences(LOCALE_FILE, Context.MODE_PRIVATE);
SharedPreferences.Editor _Edit = _SpLocal.edit();
String _LocaleJson = localeToJson(pUserLocale);
_Edit.putString(LOCALE_KEY, _LocaleJson);
_Edit.apply();
}
/**
* Locale转成json
*
* @param pUserLocale UserLocale
* @return json String
*/
private static String localeToJson(Locale pUserLocale) {
Gson _Gson = new Gson();
return _Gson.toJson(pUserLocale);
}
/**
* json转成Locale
*
* @param pLocaleJson LocaleJson
* @return Locale
*/
private static Locale jsonToLocale(String pLocaleJson) {
Gson _Gson = new Gson();
return _Gson.fromJson(pLocaleJson, Locale.class);
}
/**
* 更新Locale
*
* @param pContext Context
* @param pNewUserLocale New User Locale
*/
public static void updateLocale(Context pContext, Locale pNewUserLocale) {
if (needUpdateLocale(pContext, pNewUserLocale)) {
Configuration _Configuration = pContext.getResources().getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
_Configuration.setLocale(pNewUserLocale);
} else {
_Configuration.locale = pNewUserLocale;
}
DisplayMetrics _DisplayMetrics = pContext.getResources().getDisplayMetrics();
pContext.getResources().updateConfiguration(_Configuration, _DisplayMetrics);
saveUserLocale(pContext, pNewUserLocale);
}
}
/**
* 判断需不需要更新
*
* @param pContext Context
* @param pNewUserLocale New User Locale
* @return true / false
*/
public static boolean needUpdateLocale(Context pContext, Locale pNewUserLocale) {
return pNewUserLocale != null && !getCurrentLocale(pContext).equals(pNewUserLocale);
}
}
自己封装的语言设置的类
在使用时要在application 中设置语言
Locale userLocale=LocaleUtils.getUserLocale(this);
if(userLocale == null){
userLocale = LocaleUtils.LOCALE_CHINESE;
}
LocaleUtils.updateLocale(this, userLocale);
而且为了不响应系统设置的语言的影响我们还要
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Locale _UserLocale=LocaleUtils.getUserLocale(this);
//系统语言改变了应用保持之前设置的语言
if (_UserLocale != null) {
Locale.setDefault(_UserLocale);
Configuration _Configuration = new Configuration(newConfig);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
_Configuration.setLocale(_UserLocale);
} else {
_Configuration.locale =_UserLocale;
}
getResources().updateConfiguration(_Configuration, getResources().getDisplayMetrics());
}
}
在切换时
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (LocaleUtils.getUserLocale(mContext).equals(LocaleUtils.LOCALE_CHINESE)) { LocaleUtils.saveUserLocale(mContext, LocaleUtils.LOCALE_ENGLISH); } else if (LocaleUtils.getUserLocale(mContext).equals(LocaleUtils.LOCALE_ENGLISH)) { LocaleUtils.saveUserLocale(mContext, LocaleUtils.LOCALE_CHINESE); } } else { if (LocaleUtils.getUserLocale(mContext).equals(LocaleUtils.LOCALE_CHINESE)) { LocaleUtils.updateLocale(mContext, LocaleUtils.LOCALE_ENGLISH); } else if (LocaleUtils.getUserLocale(mContext).equals(LocaleUtils.LOCALE_ENGLISH)) { LocaleUtils.updateLocale(mContext, LocaleUtils.LOCALE_CHINESE); } }
restartAct();
/**
* 重启当前Activity
*/
private void restartAct() {
if (Build.VERSION.SDK_INT >= 11) {
recreate();
} else {
finish();
Intent _Intent = new Intent(this, LoginActivity.class);
startActivity(_Intent);
//清除Activity退出和进入的动画
overridePendingTransition(0, 0);
}
}
注意这时在8.0手机上是有问题的,还需要在(activity或者BaseActivity中添加)
@Override
protected void attachBaseContext(Context newBase) {
Context context = languageWork(newBase);
super.attachBaseContext(context);
}
private Context languageWork(Context context) {
// 8.0及以上使用createConfigurationContext设置configuration
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return updateResources(context);
} else {
return context;
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
private Context updateResources(Context context) {
Resources resources = context.getResources();
Locale locale = LocaleUtils.getUserLocale(context);;
if (locale==null) {
return context;
}
Configuration configuration = resources.getConfiguration();
configuration.setLocale(locale);
configuration.setLocales(new LocaleList(locale));
return context.createConfigurationContext(configuration);
}
以上就是切换的整个过程