Android 应用内切换语言

在所有 Activity.onCreate() 里更新语言切换的资源,无需重启 Activity

        // In Application
        registerActivityLifecycleCallbacks(object : ActivityLifecycleAdapter() {
            override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
                // 用户保存的 Locale
                val savedLocale = AppLanguageUtils.getSavedLocale()
                // 当前应用资源对应的语言
                val resLanguage = activity.resources.configuration.locale.language
                if (!TextUtils.equals(savedLocale.language, resLanguage)) {
                    LanguageUtils.updateAppLocale(activity, savedLocale)
                }
            }
        })

切换语言

    /**
     * (In SettingsActivity)
     * 更换应用语言,重启 MainActivity
     */
    private fun updateAppLocale(locale: Locale) {
        AppLanguageUtils.saveLocale(locale)

        val intent = Intent(this, MainActivity::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        startActivity(intent)
        overridePendingTransition(0, 0)
    }

LanguageUtils

    public static void updateAppLocale(Context context, Locale locale) {
        Resources resources = context.getResources();
        Configuration config = resources.getConfiguration();
        DisplayMetrics dm = resources.getDisplayMetrics();
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
            config.locale = locale;
        } else {
            config.setLocale(locale);
        }
        resources.updateConfiguration(config, dm);
    }

AppLanguageUtils(按 APP 具体需求修改)

        /**
         * 获取当前语言配置
         */
        fun getSavedLocale(): Locale {
            // 获取系统默认 Locale
            val defaultLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                LocaleList.getDefault().get(0)
            } else {
                Locale.getDefault()
            }
            // 适配:应用多语言只适配中文和英语
            val defaultLanguage = if (TextUtils.equals(Locale.CHINESE.language, defaultLocale.language)) {
                Locale.CHINESE.language
            } else {
                Locale.ENGLISH.language
            }
            // 获取用户设置的语言
            val language = PreferencesUtils.getString(PreferencesKey.LANGUAGE, defaultLanguage)
            return Locale(language)
        }

        /**
         * 保存语言配置
         */
        fun saveLocale(locale: Locale) {
            // 适配:应用多语言只适配中文和英语
            val language = if (locale == Locale.CHINESE) {
                Locale.CHINESE.language
            } else {
                Locale.ENGLISH.language
            }
            // 保存用户设置的语言
            PreferencesUtils.putString(PreferencesKey.LANGUAGE, language)
        }

results matching ""

    No results matching ""