知识小点Android小细节

Android 应用内语言切换

2020-06-16  本文已影响0人  王灵

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

前提条件

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
}

代码

对于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

上一篇下一篇

猜你喜欢

热点阅读