В моем приложении для Android у меня есть экран, который отображает несколько элементов в RecyclerView
в соответствии со следующими правилами:
- на экране отображаются 3 элемента в одной строке в портретной ориентации;
- на экране отображаются 4 элемента в одной строке в альбомной ориентации.
Чтобы позволить системе выбрать правильное значение (3 или 4) в соответствии с ориентацией устройства, я сохраняю значение в папке ресурсов:
<integer name="videos_recycler_span">3</integer>
помещается в values-sw600dp
<integer name="videos_recycler_span">4</integer>
помещается в values-sw600dp-land
Я также переопределяю attachBaseContext
метод Activity
, потому что я хотел бы управлять языком приложения независимо от языка устройства.
Вот метод:
override fun attachBaseContext(newBase: Context)
{
val appCountry = DataContainer.INSTANCE.getUICountry(newBase)
val appLang = DataContainer.INSTANCE.getUILang(newBase)
val appLocale = Locale(appLang, appCountry)
val wrapped = LangContextWrapper.wrap(newBase, appLocale)
super.attachBaseContext(wrapped)
}
А вот класс LangContextWrapper
:
class LangContextWrapper(base: Context)
: ContextWrapper(base)
{
companion object
{
fun wrap(context: Context, newLocale: Locale): ContextWrapper
{
val res = context.resources
val configuration = res.configuration
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
{
configuration.setLocale(newLocale)
val localeList = LocaleList(newLocale)
LocaleList.setDefault(localeList)
configuration.locales = localeList
}
else
{
configuration.setLocale(newLocale)
val dm = res.displayMetrics
res.updateConfiguration(configuration, dm)
}
configuration.setLayoutDirection(newLocale)
return ContextWrapper(context.createConfigurationContext(configuration))
}
}
}
Затем из моего фрагмента я получаю необходимое значение с помощью resources.getInteger(R.integer.videos_recycler_span)
.
Это прекрасно работает, если я изменяю ориентацию до запуска экрана, но как минимум на 2 устройствах, ресурс остается на экране и вращаюсь.
Устройства:
- Планшет Samsung SM-T550 на Android 7.1.1
- Планшет Samsung SM-T285 на Android 5.1.1
У меня нет других физических планшетов для тестирования, но я не воспроизводю проблему, например, на эмуляторе.
Если я не переопределю attachBaseContext
, он снова заработает.
Итак, я думаю, что есть проблема с моим LangContextWrapper
классом на некоторых устройствах Samsung? Может кто-нибудь знает что это за проблема и как ее исправить?