Android 应用内语言切换不重建Activity,使用recreate

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(),使页面上下文语言修改

Android 应用内语言切换不重建Activity,使用recreate_第1张图片

所有的getString(id) 需要使用Activity否则获取的仍然是根据系统获取文本

Android 应用内语言切换不重建Activity,使用recreate_第2张图片

SVID_20230504_112008_1

你可能感兴趣的:(android,java,开发语言)