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

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

SVID_20230504_112008_1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值