美文网首页知识小点Android小细节
Android 应用内语言切换

Android 应用内语言切换

作者: 王灵 | 来源:发表于2020-06-16 18:08 被阅读0次

    如果是做国际类APP,那么肯定会涉及到多国语言切换的问题。本文简单的实现语言的切换。

    前提条件

    • 基础类 直接复制粘贴
      LanguageUtil.kt 主要功能提供
    object LanguageUtil : SPLanguageInterface {
        //    companion object {
        fun attachBaseContext(context: Context): Context {
    
            return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                updateResources(context, language)
            } else {
                context
            }
        }
    
        fun getLocaleByLanguage(language: String): Locale {
            return when (language) {
    //            Locale.ENGLISH.language -> Locale.ENGLISH
    //                Locale.JAPAN.language -> Locale.JAPAN
    //                else -> Locale.SIMPLIFIED_CHINESE
                else -> Locale.forLanguageTag(language)
            }
        }
    
        @TargetApi(Build.VERSION_CODES.N)
        fun updateResources(context: Context, language: String): Context {
            var resoures = context.resources
            var configuration = resoures.configuration
            var locale = getLocaleByLanguage(language)
    
            configuration.setLocale(locale)
            configuration.setLocales(LocaleList(locale))
            return context.createConfigurationContext(configuration)
        }
    
        @SuppressWarnings("deprecation")
        fun changeAppLanguage(context: Context) {
            if (TextUtils.isEmpty(language)) {
                return
            }
            var resources = context.resources
            var configuration = resources.configuration
            var locale = getLocaleByLanguage(language)
            configuration.setLocale(locale)
            context.createConfigurationContext(configuration)
        }
    
        lateinit var spLanguageInterface: SPLanguageInterface
        fun init(spLanguageInterface: SPLanguageInterface) {
            this.spLanguageInterface = spLanguageInterface
        }
    
    //    }
    
        override var language: String
            get() = spLanguageInterface.language
            set(value) {
                spLanguageInterface.language = value
            }
    
    }
    

    SPLanguageInterface.kt 需要使用SP实现的语言设置于获取方法

    interface SPLanguageInterface {
    
        /**
         * 获取语言
         */
        /**
         * 设置语言
         */
        var language: String
    }
    
    • 语言文件
      语言文件.png
      注意: values-en里的en最好与SP里存储一致

    代码

    对于Android7.0及以上版本需要重写Activity的attachBaseContext方法。建议重写BaseActivity的attachBaseContext方法。

    open class LanguageActivity : AppCompatActivity() {
        override fun attachBaseContext(newBase: Context) {
            super.attachBaseContext(LanguageUtil.attachBaseContext(newBase))
        }
    }
    

    对于Android7.0之前的版本需要在Application里去调用

    public class MyApplication extends Application implements SPLanguageInterface {
        public static MyApplication application;
    
        @Override
        public void onCreate() {
            super.onCreate();
            application = this;
    
            LanguageUtil.INSTANCE.init(this);//初始化LanguageUtil 需要提供SPLanguageInterface的实现类
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
                LanguageUtil.INSTANCE.changeAppLanguage(this);
            }
        }
    //使用SP实现设置语言
        @Override
        public void setLanguage(String language) {
            SpUtil.Companion.getInstance(application).putString(SpUtil.LANGUAGE, language);
        }
    //使用SP实现获取语言
        @Override
        public String getLanguage() {
            return SpUtil.Companion.getInstance(this).getString(SpUtil.LANGUAGE);
        }
    }
    

    注意:SPLanguageInterface接口并不是一定要在Application里实现。

    至此就基本完成了,只是简单的实现。

    在Activity中去切换

    class WelcomeActivity : LanguageActivity(), View.OnClickListener {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_welcome)
    
            china.setOnClickListener(this)
            english.setOnClickListener(this)
            japanese.setOnClickListener(this)
            french.setOnClickListener(this)
        }
    
        override fun onClick(v: View) {
            var s = when (v.id) {
    
                R.id.english -> {
                    Locale.ENGLISH.language
                }
                R.id.japanese -> {
                    Locale.JAPAN.language
                }
                R.id.french -> {
                    "fr"
                }
                else -> {
                    Locale.CHINA.language
                }
            }
            var string = LanguageUtil.language//获取sp保存的语言
            if (string != s) {//当需要切换的语言与sp保存的不一样时才会切换
               LanguageUtil.language=s
    //实际场景分为两种。1、应用第一次安装,在初始化界面选择语言,不需要重新启动。2、在使用过程中切换,需要重新启动程序。因为涉及到之前已经加载的页面。而且接口返回语种也需要变更。
                startActivity(Intent(this, WelcomeActivity::class.java))
                finish()
            }
        }
    }
    
    

    参考:https://www.jianshu.com/p/4f9db19d9383

    相关文章

      网友评论

        本文标题:Android 应用内语言切换

        本文链接:https://www.haomeiwen.com/subject/zfprxktx.html