Android 应用内语言切换如果采用重建Activity方式的话,会有切换Activity效果(finish-startActivity),在视觉上体验效果不理想,而采用recreate,虽然也是销毁再重建的过程,Activity的生命周期变化是先onPause()–>onStop()–>onDestory()(销毁),然后onCreate()–>onStart()–>onResume()(重建),但不会有切换页面
1 根据语言设置地区
public static Locale getLocaleByLanguage(String language) {
Locale locale = Locale.SIMPLIFIED_CHINESE;
if (language.equals(LanguageType.CHINESE.getLanguage())) {
locale = Locale.SIMPLIFIED_CHINESE;
} else if (language.equals(LanguageType.ENGLISH.getLanguage())) {
locale = Locale.ENGLISH;
}
Log.d("TAG", "getLocaleByLanguage: " + locale.getDisplayName());
return locale;
}
2 切换语言
fun setConfiguration(context: Context) {
var language = Global.getLanguage()
if (!Global.isSetLanguage()) {
if (LanguageUtils.isZhText()) {
if (language != Constant.LANGUAGE_ZH) {
//app未启动的时候, 系统语言切换,先按系统语言切换,之后再提交后天系统语言已经切换
language = Constant.LANGUAGE_ZH
}
} else {
if (language != Constant.LANGUAGE_EN) {
//app未启动的时候, 系统语言切换,先按系统语言切换,之后再提交后天系统语言已经切换
language = Constant.LANGUAGE_EN
}
}
}
val locale: Locale = getLocaleByLanguage(language)
val configuration: Configuration = context.resources.configuration
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(locale)
} else {
configuration.locale = locale
}
val resources: Resources = context.resources
val dm: DisplayMetrics = resources.displayMetrics
resources.updateConfiguration(configuration, dm) //语言更换生效的代码!
}
3 调用切换语言,在点击切换处,设置想要切换的语言
var sysLanguage = Constant.SERVER_LANGUAGE_CN
if (language == LANGUAGE_EN){
sysLanguage = Constant.SERVER_LANGUAGE_EN
}
Global.setLanguage(language)
LanguageUtils.changeAppLanguage(ActivityUtil.getTopActivity(), language)
//整个App上下文语言修改
App.setConfiguration(App.self)
ActivityUtil.allActivityRecreate()
注:系统切换语言的话,应用会自动重新刷新页面不用调用recreate。只要在进行设置
//整个App上下文语言修改
App.setConfiguration(App.self)
注:在Activity 启动的Oncreate需要调用setConfiguration(),使页面上下文语言修改
所有的getString(id) 需要使用Activity否则获取的仍然是根据系统获取文本
SVID_20230504_112008_1