Изменение темы приложения без воссоздания активности

У меня есть тема с Theme.AppCompat.DayNight.NoActionBar как родитель с ресурсами для дневного и ночного режимов.

В документации представлен метод для изменения темы, и если текущее действие не будет воссоздано, тема изменится только при следующем запуске действия.

Twitter и Pocket, с другой стороны, меняют темы, не воссоздавая активность пользователя.

Как я могу достичь этого?

0 ответов

Twitter и Pocket, с другой стороны, меняют темы, не воссоздавая активность пользователя.

Откуда вы знаете? Если вы правильно обрабатываете сохраненное состояние и предоставляете анимацию, которая не похожа на смену окон, вы можете сделать так, чтобы отдых выглядел достаточно хорошо. Фактически, вы можете сделать так, чтобы это выглядело так хорошо, что вы даже не узнали бы, что действие было воссоздано.

Бег adb shell dumpsys activity дает следующий результат до и после переключения ночного режима в Twitter:

ResumedActivity: ActivityRecord{40c4156 u0 com.twitter.android/com.twitter.app.main.MainActivity t11398}
ResumedActivity: ActivityRecord{adca640 u0 com.twitter.android/com.twitter.app.main.MainActivity t11399}

Обратите внимание, что хэш-код активности изменился - действие воссоздано. Это верно как для последней версии Twitter, так и для Twitter 6.22.1, опубликованной 9 ноября 2016 г.

Сменить тему - нетривиальная задача. Вам нужно будет пройти всю иерархию представлений и изменить все цвета фона, цвета текста, рябь (удачи с этим), и вам нужно будет убедиться, что любой будущий вызовgetResources().get* вернет правильные ресурсы.

С другой стороны, вы можете просто позвонить Activity.recreate() и позвольте системе делать то, на что она уже запрограммирована.

После этого вы могли позвонить Activity.overridePendingTransition(...)с некоторыми анимациями, которые не меняют размер и положение окна. Есть и другие способы анимировать переход окон.

Другие вопросы по тегам