Android 应用内切换语言
在所有 Activity.onCreate() 里更新语言切换的资源,无需重启 Activity
// In Application
registerActivityLifecycleCallbacks(object : ActivityLifecycleAdapter() {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
// 用户保存的 Locale
val savedLocale = AppLanguageUtils.getSavedLocale()
// 当前应用资源对应的语言
val resLanguage = activity.resources.configuration.locale.language
if (!TextUtils.equals(savedLocale.language, resLanguage)) {
LanguageUtils.updateAppLocale(activity, savedLocale)
}
}
})
切换语言
/**
* (In SettingsActivity)
* 更换应用语言,重启 MainActivity
*/
private fun updateAppLocale(locale: Locale) {
AppLanguageUtils.saveLocale(locale)
val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
startActivity(intent)
overridePendingTransition(0, 0)
}
LanguageUtils
public static void updateAppLocale(Context context, Locale locale) {
Resources resources = context.getResources();
Configuration config = resources.getConfiguration();
DisplayMetrics dm = resources.getDisplayMetrics();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
config.locale = locale;
} else {
config.setLocale(locale);
}
resources.updateConfiguration(config, dm);
}
AppLanguageUtils(按 APP 具体需求修改)
/**
* 获取当前语言配置
*/
fun getSavedLocale(): Locale {
// 获取系统默认 Locale
val defaultLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
LocaleList.getDefault().get(0)
} else {
Locale.getDefault()
}
// 适配:应用多语言只适配中文和英语
val defaultLanguage = if (TextUtils.equals(Locale.CHINESE.language, defaultLocale.language)) {
Locale.CHINESE.language
} else {
Locale.ENGLISH.language
}
// 获取用户设置的语言
val language = PreferencesUtils.getString(PreferencesKey.LANGUAGE, defaultLanguage)
return Locale(language)
}
/**
* 保存语言配置
*/
fun saveLocale(locale: Locale) {
// 适配:应用多语言只适配中文和英语
val language = if (locale == Locale.CHINESE) {
Locale.CHINESE.language
} else {
Locale.ENGLISH.language
}
// 保存用户设置的语言
PreferencesUtils.putString(PreferencesKey.LANGUAGE, language)
}