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.