Ресурсы не обновляются после ротации при переопределении ContextWrapper - PullRequest
0 голосов
/ 26 апреля 2019

В моем приложении для 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? Может кто-нибудь знает что это за проблема и как ее исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...