首先扯点别的:这是第一次在简书上写东西,我突然明白为啥这么多人在简书上写东西了,因为没有广告啊,哈哈。
最近接触到Android 应用内切换语言的问题,研究了两天,做个记录先。实现了中文,英文,泰语的切换。测试机器 Nexus5(Android p),HUAWEI荣耀9青春版(8.0.0),XIAOMI mi 4LTE(6.0.1)。看下效果
language.gif
完整的例子在底部
实现步骤
首先需要新建对应语言环境下的资源文件
微信截图_20180605205842.png
对于Android7.0及以上版本
定义一个BaseActivity,重写attachBaseContext方法,在此方法里进行语言切换
public class BaseActivity extends AppCompatActivity {
/**
* 此方法先于 onCreate()方法执行
* @param newBase
*/
@Override
protected void attachBaseContext(Context newBase) {
//获取我们存储的语言环境 比如 "en","zh",等等
String language = SpUtil.getInstance(App.getContext()).getString(SpUtil.LANGUAGE);
//attach 对应语言环境下的context
super.attachBaseContext(LanguageUtil.attachBaseContext(newBase, language));
}
}
LanguageUtil中的attachBaseContext()方法
public static Context attachBaseContext(Context context, String language) {
Log.d(TAG, "attachBaseContext: "+Build.VERSION.SDK_INT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResources(context, language);
} else {
return context;
}
}
@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
Resources resources = context.getResources();
Locale locale = LanguageUtil.getLocaleByLanguage(language);
Configuration configuration = resources.getConfiguration();
configuration.setLocale(locale);
configuration.setLocales(new LocaleList(locale));
return context.createConfigurationContext(configuration);
}
在attachBaseContext()方法中,我们判断一下,如果当前api大于24,那么就调用updateResources()方法更新context。
定义好BaseActivity以后,我们只需要让我们的Activity都继承这个基类即可。
对于Android7.0及以下版本
自定义Application并在AndroidManifest.xml文件中声明,在Application的onCreate()方法中,调用更换语言的方法即可。
public class App extends Application {
private static Context context;
private final String TAG = getClass().getSimpleName();
@Override
public void onCreate() {
super.onCreate();
context = this;
/**
* 对于7.0以下,需要在Application创建的时候进行语言切换
*/
String language = SpUtil.getInstance(this).getString(SpUtil.LANGUAGE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
LanguageUtil.changeAppLanguage(App.getContext(), language);
}
}
public static Context getContext() {
return context;
}
}
微信截图_20180605211204.png
LanguageUtil中的changeAppLanguage方法
/**
* @param context
* @param newLanguage 想要切换的语言类型 比如 "en" ,"zh"
*/
@SuppressWarnings("deprecation")
public static void changeAppLanguage(Context context, String newLanguage) {
if (TextUtils.isEmpty(newLanguage)) {
return;
}
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
//获取想要切换的语言类型
Locale locale = getLocaleByLanguage(newLanguage);
configuration.setLocale(locale);
// updateConfiguration
DisplayMetrics dm = resources.getDisplayMetrics();
resources.updateConfiguration(configuration, dm);
}
经过上面的操作就可以在7.0以下实现应用内切换语言。
手动切换语言
定义一个ChangeLanguageActivity
public void onClick(View view) {
String language = null;
switch (view.getId()) {
case R.id.btn_chinese:
//切换为简体中文
language = LanguageType.CHINESE.getLanguage();
break;
case R.id.btn_english:
//切换为英语
language = LanguageType.ENGLISH.getLanguage();
break;
case R.id.btn_thailand:
//切换为泰语
language = LanguageType.THAILAND.getLanguage();
break;
default:
break;
}
changeLanguage(language);
}
/**
* 如果是7.0以下,我们需要调用changeAppLanguage方法,
* 如果是7.0及以上系统,直接把我们想要切换的语言类型保存在SharedPreferences中,然后重新启动MainActivity即可
* @param language
*/
private void changeLanguage(String language) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
LanguageUtil.changeAppLanguage(App.getContext(), language);
}
SpUtil.getInstance(this).putString(SpUtil.LANGUAGE, language);
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}
如果是7.0以下,我们需要调用changeAppLanguage方法, 如果是7.0及以上系统,直接把我们想要切换的语言类型保存在SharedPreferences中,然后重新启动MainActivity即可。
如果控件尺寸固定,当切换语言的时候,文字长短发生变化如何解决?
可以使用google提供的新特性来解决。