Фрагменты Android с наблюдаемыми. Когда добавить и заменить другие фрагменты
Еще один фрагмент вопроса.
Для контекста:
- Одно приложение активности с двумя фрагментами, Домой и Настройки.
- Моя активность сразу добавляет Домой, когда приложение запускается.
- На этом экране пользователь может нажать значок настроек, чтобы просмотреть фрагмент настроек.
Именно в этот момент я не уверен, должен ли я использовать #add или #replace, чтобы показать мой фрагмент настроек.
Позвольте мне объяснить, почему.
- замещать
Замена фрагмента довольно крутая. У этого есть хорошая анимация входа / выхода для обоих фрагментов. И вызываются методы жизненного цикла paused->destroy в Home, позволяющие удалить любые наблюдаемые и освободить ссылки, которые больше не нужны, так как представление больше не отображается.
Однако, когда я нажимаю кнопку "Назад", чтобы выскочить из настроек, "Домашняя страница" теперь должна воссоздать себя. Поскольку происходит несколько вещей и несколько сложный список, я получу частоту кадров ниже 60 кадров в секунду для одного кадра (с помощью инструмента профилирования gpu). Некоторые телефоны могут питаться через это, но такие, как Nexus 5, не могут и имеют уродливый эффект перехода и задержку задержки (возможно, 500 мс- 1 с) до того, как вид фактически выскочит после нажатия кнопки.
- добавлять
Добавление фрагмента тоже довольно круто. У него нет проблем с частотой кадров при переходе назад. На всех моих тестовых устройствах это выглядит красиво и гладко.
Однако это на самом деле не выходит из вида. Так что нет анимации выхода. События жизненного цикла для выпуска наблюдателей также не вызываются, поэтому он по-прежнему изменяет представление на изменения, которые он получает, даже если пользователь его не видит.
Итак, какое решение подходит для моего случая? Есть ли на это обычный ответ? Или есть что-то еще, что я должен делать? Должен ли я рефакторинг большого количества кода для оптимизации замены фрагмента? Или Дом может сидеть на заднем плане и слушать события?
1 ответ
В случае, если ваши данные необходимо сохранить на странице настроек и перемещаться туда-сюда, затем добавьте строку
transaction.addToBackStack(null);
было бы полезно, но,
Если вы пройдете home-settings-home еще несколько раз, у вас будут большие проблемы с нажатием кнопки "назад". Это событие будет перемещено обратно в ваш стек до тех пор, пока не останется последняя страница фрагмента.
Так что, для простоты, при добавлении фрагмента настроек не используйте
transaction.addToBackStack(null);
Для замены,
(Динамические данные на домашней странице будут удалены при замене и восстановлены при добавлении из настроек или перезапуске приложения). Ваша домашняя страница будет загружаться каждый раз, возвращаясь со страницы настроек, и это было бы плохой идеей.
Замена используется, когда страница фрагмента больше не требуется для следующих операций или использование этого фрагмента завершено.