Метод onConfigurationChanged() не вызывается при изменении Локали
Я хочу реализовать возможность переключения языка в синглАктивити-приложении. Как я понял, при изменении Локали (Local) должен вызываться метод onConfigurationChanged, в нем я планировал вызвать recreate у Активити, но судя по логам вызов не происходит.
Вот манифест приложения:
<activity
android:name=".presentation.activities.main.MainActivity"
android:exported="true"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize"
android:configChanges="layoutDirection|locale|orientation|screenSize"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- filter for DeepLink handling -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data
android:host="@string/app_host_main"
android:scheme="@string/app_scheme" />
</intent-filter>
</activity>
Приложение поддерживает направление текста справа налево (android:supportsRtl="true")
И собственно кусок кода из Activity, локаль по умолчанию стоит русская, я ее прямо в onCreate меняю на английскую
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
installSplashScreen()
setContentView(viewBinding.root)
// Setting up start destination
defineStartDestination()
setupBottomNavigationView()
val config = Configuration(this.resources.configuration)
val locale = Locale("en")
Locale.setDefault(locale)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
config.setLocale(locale)
Log.d("Kty", "am1")
} else {
config.locale = locale
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
this.createConfigurationContext(config)
this.resources.updateConfiguration(config, this.resources.displayMetrics)
Log.d("Kty", "am2")
}
config.setLocale(locale)
config.setLayoutDirection(locale)
this.createConfigurationContext(config)
}
override fun onConfigurationChanged(newConfig: Configuration) {
Log.d("Kty", "Conf changed")
super.onConfigurationChanged(newConfig)
Log.d("Kty", "Conf changed")
}
В логах я вижу "am1", "am2", но не "Conf changed". Приложение отображается на английском, т е локаль меняется, но onConfigurationChanged() не вызывается. Я хочу понять почему. Значит ли это что onConfigurationChanged() вызывается только при изменении настроек устройства, но не приложения ? В документации-исходниках есть фраза Called by the system when the device configuration changes while your activity is running. Или я делаю что-то не так?
Ответы (1 шт):
Вот тут написано о locale
The locale has changed — the user has selected a new language that text should be displayed in.
Стоит понимать что программные смены локали не засчитываются, о них вы и так знаете.