安卓多语言设置,深渊巨坑,适配7.0以上,并且解决因WebView产生的问题
生活随笔
收集整理的這篇文章主要介紹了
安卓多语言设置,深渊巨坑,适配7.0以上,并且解决因WebView产生的问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前言
安卓的多語言設(shè)置配置中strings.xml我就不說怎么弄了,主要說一下后續(xù)遇到的坑
正文
上個月接到需求,要給app內(nèi)添加多語言設(shè)置,我心想沒啥難的,配置一下strings.xml,加個修改的頁面并保存到本地就ok了
然后過了一陣,發(fā)現(xiàn)坑真多,然后我寫了個工具類,如下:
/*** creator: lt 2019/7/29--16:36 lt.dygzs@qq.com* effect : 多語言管理類* warning:*/ object LanguageManager {enum class LocaleEnum(val value: Int) {DEFAULT(0),//跟隨系統(tǒng)CHINESE(1),//簡體中文TRADITIONAL_CHINESE(2),//繁體中文ENGLISH(3),//英文}/*** 獲取地區(qū)對應(yīng)的enum*/@JvmStaticfun getLocaleEnum(locale: Locale): LocaleEnum {return when {locale.language == Locale.SIMPLIFIED_CHINESE.language -> //中國文字if (locale.country == Locale.SIMPLIFIED_CHINESE.country || locale.country.isEmpty()) {//簡體LanguageManager.LocaleEnum.CHINESE} else {//其他就是繁體文字LanguageManager.LocaleEnum.TRADITIONAL_CHINESE}locale.language == Locale.US.language -> //英文LanguageManager.LocaleEnum.ENGLISHelse -> //其他就是默認的,使用系統(tǒng)語言LanguageManager.LocaleEnum.DEFAULT}}/*** 獲取app當前的地區(qū)設(shè)置*/@JvmStaticfun getAppLocale(): Locale {return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {BaseApplication.getApp().resources.configuration.locales[0]} else {BaseApplication.getApp().resources.configuration.locale}}/*** 獲取系統(tǒng)的地區(qū)設(shè)置*/@JvmStaticfun getSystemLocale(): Locale {return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {Resources.getSystem().configuration.locales[0]} else {Resources.getSystem().configuration.locale}}/*** 獲取本地存儲的地區(qū)設(shè)置*/@JvmStaticfun getNativeLocale(): Locale {return when (SPUtil.readInt("setting", "locale", LanguageManager.LocaleEnum.DEFAULT.value)) {LanguageManager.LocaleEnum.CHINESE.value -> Locale.SIMPLIFIED_CHINESELanguageManager.LocaleEnum.TRADITIONAL_CHINESE.value -> Locale.TRADITIONAL_CHINESELanguageManager.LocaleEnum.ENGLISH.value -> Locale.USelse -> getSystemLocale()}}/*** 保存地區(qū)設(shè)置到本地*/@JvmStaticfun saveNativeLocale(localeEnum: LocaleEnum) {SPUtil.write("setting", "locale", localeEnum.value)}/*** 設(shè)置語言*/@JvmStaticfun setLanguage(context: Context, locale: Locale) {val config = context.resources.configuration//獲取配置config.locale = locale// 根據(jù)當前語言來判斷,并更改當前語言if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {config.setLocale(locale)}// 根據(jù)當前語言來判斷,并更改當前語言context.resources.updateConfiguration(config, context.resources.displayMetrics)//更新配置if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {context.createConfigurationContext(config)}//更新配置}/*** 初始化有WebView的Activity,必須在onCreate的super下面一行調(diào)用*/@JvmStaticfun initWebViewActivity(activity: Activity) {WebView(activity).destroy()setLanguage(activity, getNativeLocale())setLanguage(BaseApplication.getApp(), getNativeLocale())}/*** 在BaseActivity的attachBaseContext方法中調(diào)用*/@JvmStaticfun attachBaseContext(context: Context?): ContextWrapper {if (context != null)setLanguage(context, getNativeLocale())return ContextWrapper(context)}}使用有幾個注意點:
1.初始化地點:
Application的onCreate()中調(diào)用一次
LanguageManager.setLanguage(this, LanguageManager.getNativeLocale())然后在BaseActivity中調(diào)用如下:在頁面初始化的時候設(shè)置一下語言(我之前沒這樣設(shè)置的時候華為手機沒問題,但是vivo手機很大幾率出現(xiàn)語言錯亂,所以加上這個)
override fun attachBaseContext(newBase: Context?) {super.attachBaseContext(LanguageManager.attachBaseContext(newBase))}2.更改語言設(shè)置:
//根據(jù)設(shè)置傳入用戶選中的locale LanguageManager.saveNativeLocale(LanguageManager.getLocaleEnum(locale)) LanguageManager.setLanguage(this, locale) LanguageManager.setLanguage(BaseApplication.getApp(), locale) recreate();//重新啟動當前Activity來改變當前頁面的語言3.WebView的坑
我做完了前面的操作,工具類也封裝好了,就在我以為完美的時候,現(xiàn)實再次給了我當頭一棒,,,,Android7.0以上的WebView竟然會改變當前語言的設(shè)置???
然后查了一下,并參考https://blog.csdn.net/xunmeng_93/article/details/78632210
加了個方法,用法如下:
在有用到WebView的頁面內(nèi),在onCreate()內(nèi)調(diào)用如下方法,即可解決這種問題 override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)LanguageManager.initWebViewActivity(this)//注意放在super的下面一行............ }?然后在Application的onCreate中的super.onCreate下調(diào)用以下代碼
try {new WebView(this).destroy();} catch (Exception e) {e.printStackTrace();}然后就解決了,emmm方案近乎完美 /捂臉
總結(jié)
以上是生活随笔為你收集整理的安卓多语言设置,深渊巨坑,适配7.0以上,并且解决因WebView产生的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kotlin优雅的使用sp(Shared
- 下一篇: 安卓UI图分离器(支持ios@2x3x图