Language change issue after updating to androidx.appcompat:appcompat:1.1.0 Language change issue after updating to androidx.appcompat:appcompat:1.1.0 android android

Language change issue after updating to androidx.appcompat:appcompat:1.1.0


Edit:

To continue using version 1.1.0 add this below your attachBaseContext:

Kotlin solution:

override fun applyOverrideConfiguration(overrideConfiguration: Configuration?) {    if (overrideConfiguration != null) {        val uiMode = overrideConfiguration.uiMode        overrideConfiguration.setTo(baseContext.resources.configuration)        overrideConfiguration.uiMode = uiMode    }    super.applyOverrideConfiguration(overrideConfiguration)}

Java solution:

@Overridepublic void applyOverrideConfiguration(Configuration overrideConfiguration) {    if (overrideConfiguration != null) {        int uiMode = overrideConfiguration.uiMode;        overrideConfiguration.setTo(getBaseContext().getResources().getConfiguration());        overrideConfiguration.uiMode = uiMode;    }    super.applyOverrideConfiguration(overrideConfiguration);}

If you don't need to upgrade to the latest appCompat then check the old answer. Else use the solution provided by @0101100101 here.

Old Answer:

After spending hours trying, got to know that it might be a bug.

Downgrade to the last stable version and it works flawlessly.

dependencies {    implementation 'androidx.appcompat:appcompat:1.0.2'   //************ DO NOT UPGRADE LANGUAGE ISSUE on API 23 and below *******************//    implementation 'androidx.legacy:legacy-support-v4:1.0.0'....}

Meanwhile, I have filed an issue with Google https://issuetracker.google.com/issues/140880275


There is an issue in new app compat libraries related to night mode that is causing to override the configuration on android 21 to 25.This can be fixed by applying your configuration when this public function is called:

public void applyOverrideConfiguration(Configuration overrideConfiguration

For me, this little trick has worked by copying the settings from the overridden configuration to my configuration but you can do whatever you want. It is better to reapply your language logic to the new configuration to minimize errors

@Overridepublic void applyOverrideConfiguration(Configuration overrideConfiguration) {if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT <= 25) {        //Use you logic to update overrideConfiguration locale        Locale locale = getLocale();//your own implementation here        overrideConfiguration.setLocale(locale);}super.applyOverrideConfiguration(overrideConfiguration);}


To work well locale change with the latest appcompat v1.2.0 use the below code.

(1) Add this function to your base activity.

@Overrideprotected void attachBaseContext(Context newBase) {    super.attachBaseContext(setDefaultLanguage(newBase)); // Selected app language.    applyOverrideConfiguration(newBase.getResources().getConfiguration());}

Note: Do not override this method "applyOverrideConfiguration" in your activity.