Android context.getResources.updateConfiguration() deprecated

后端 未结 7 693
死守一世寂寞
死守一世寂寞 2020-11-22 16:05

Just recently context.getResources().updateConfiguration() has been deprecated in Android API 25 and it is advised to use context.createConfigurationContext() instead.

7条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-22 16:42

    Here's @bassel-mourjan's solution with a bit of kotlin goodness :) :

    import android.annotation.TargetApi
    import android.content.ContextWrapper
    import android.os.Build
    import java.util.*
    
    @Suppress("DEPRECATION")
    fun ContextWrapper.wrap(language: String): ContextWrapper {
        val config = baseContext.resources.configuration
        val sysLocale: Locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            this.getSystemLocale()
        } else {
            this.getSystemLocaleLegacy()
        }
    
        if (!language.isEmpty() && sysLocale.language != language) {
            val locale = Locale(language)
            Locale.setDefault(locale)
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                this.setSystemLocale(locale)
            } else {
                this.setSystemLocaleLegacy(locale)
            }
        }
    
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            val context = baseContext.createConfigurationContext(config)
            ContextWrapper(context)
        } else {
            baseContext.resources.updateConfiguration(config, baseContext.resources.displayMetrics)
            ContextWrapper(baseContext)
        }
    
    }
    
    @Suppress("DEPRECATION")
    fun ContextWrapper.getSystemLocaleLegacy(): Locale {
        val config = baseContext.resources.configuration
        return config.locale
    }
    
    @TargetApi(Build.VERSION_CODES.N)
    fun ContextWrapper.getSystemLocale(): Locale {
        val config = baseContext.resources.configuration
        return config.locales[0]
    }
    
    
    @Suppress("DEPRECATION")
    fun ContextWrapper.setSystemLocaleLegacy(locale: Locale) {
        val config = baseContext.resources.configuration
        config.locale = locale
    }
    
    @TargetApi(Build.VERSION_CODES.N)
    fun ContextWrapper.setSystemLocale(locale: Locale) {
        val config = baseContext.resources.configuration
        config.setLocale(locale)
    }
    

    And here is how you use it:

    override fun attachBaseContext(newBase: Context?) {
        super.attachBaseContext(ContextWrapper(newBase).wrap(defaultLocale.language))
    }
    

提交回复
热议问题