Как стать автором
Обновить

Комментарии 20

Прошу прощения за «нубский»вопрос, но все же: Чем грозит использование «устаревших» методов в приложении?
Не гарантируется работа, остановоенна поддержка. Выйдет android 8 и окажется, что на нем это не работает.
Начиная с android 7 вложенные активити в TabActivity не получают onConfigurationChanged() при повороте, например.

А вы про вложенные фрагменты не слышали? Делаете для каждого таба корневой фрагмент и все под экраны этого таба складируется как "подфрагменты" этого фрагмента, соответственно их бэкстек хранится во фрагмент менеджере коневого фрагмента и сохраняется вместе с состоянием корневого фрагмента. Надеюсь как сохранять состояние фрагментов при переключении табов вы в курсе. Собственно это вроде уже довольно стандартное решение вашей задачи.
Есть правда мнение что вложенные фрагменты это нереальное зло и приводит к невообразимому числу подводных камней, костылей и багов. Но лично у мня за два года их использования проблемы с ними возникали не часто и каких то критических или нерешаемых проблем не было. Хотя бывает что с ними приходится хорошенько подумать и покурить сорци андройда для лучшего понимания их жизненного цикла. Но в андройде так имхо почти везде...

Есть ссылка на реальное, работающее приложение, где реализовано поведение через вложенные фрагменты, где фрагменты отображают что-то чуть сложнее просто текста?

Есть даже пяток:
https://play.google.com/store/apps/details?id=com.touchin.redmond
https://play.google.com/store/apps/details?id=com.riotrus.guilds
https://play.google.com/store/apps/details?id=com.nascar.nascarmobile
https://play.google.com/store/apps/details?id=com.vzw.indycar
https://play.google.com/store/apps/details?id=com.dfbpokal.mobile
В первых двух правда уже не очень помню на сколько повсеместно используются вложенные фрагменты, возможно всего на паре экранов, но вот на следующих двух вложенные фрагменты просто таки по всюду, и даже там где и не нужно.., но уж в таком виде нам оно нам досталось на допиливание.

То, что вложенные фрагменты работают — я не сомневаюсь, но хорошо они работают до тех пор, пока не попадают в backstack. В каком из 5 приложений искать такой случай?

Ну если вы про случай описанный в статье. То есть с переключением между несколькими бэк стеками, то боюсь такого кейса нет ни в одном из приложений. Ну а просто вложенные фрагменты внутри какого либо экрана который может попасть в бэк стек точно есть в 4м (com.vzw.indycar), какие то конкретные экраны правда боюсь назвать так сходу не смогу.

Надеюсь как сохранять состояние фрагментов при переключении табов вы в курсе.

Расскажите мне.
Допустим мы имеем 2 таба. Мы переключились из первого таба (в котором у нас RecyclerView в котором в свою очередь ViewPager) во второй. Как нам сохранить состояние первого фрагмента не держа его в памяти?

saveFragmentInstanceState не предлагать, — всё-равно не работает.

saveFragmentInstanceState вполне себе работает, пользовался им несколько раз, никаких багов не наблюдал, правда последний раз это было с год назад. Проблемы скорее могут возникнуть с сохранением состояния RecyclerView и особенно ViewPager, точнее с восстановлением этих состояний. На сколько помню у обоих этих контролов позиция нормально восстанавливается только если восстанавливать её не сразу в onCreate/onViewCreated или onViewStateRestored а с небольшой задержкой через метод post. А учитывая что ViewPager в ячейке RecyclerView, надо его состояние через адаптер прокидывать и уже там в bindViewHolder восстанавливать, опять же возможно с отложенным через post вызовом setCurrentItem. Но это всё к вложенным фрагментам отношения не имеет, без вложенностей и даже вообще без фрагментов придется городить всё те же костыли(
Можно ещё заюзать FragmentStatePagerAdapter для табов что бы самому не писать сохранение/восстановление состояний, но он работает через тот же saveFragmentInstanceState, так что это уже просто вопрос удобства.

RecyclerView и ViewPager прекрасно возвращаются из бекстека ровно в том состоянии, в котором и были туда положены.
и даже вообще без фрагментов придется городить всё те же костыли

А вообще без фрагментов это как?) При возврате по стеку activity уж точно восстанавливается предыдущее состояние в прежнем виде без всяких костылей.
А почему скриншот с iOS а в статье про Android?
Не пробовал https://github.com/JetradarMobile/multibackstack?
This library we use in our app Hotellook.


А вы пробовали? Где там полное восстановление истории при переключении вкладки?
Нажал поиск, пролистал до конца списка, переключился в избранное, снова переключился в поиск — и мы в начале списка. Немного не так, как в Instagram.
Смотрим их же приложение на ios, и там всё ок…
А при просмотре конкретно отеля в поиске, и переключении вкладок, сначала вообще открывается список, а потом уже описание.
Опять же на ios всё ок.

Вложенные фрагменты, конечно зло, но порой без них никак… И это явно лучше чем использовать deprecated класс

А, как вы считаете, почему Instagram считает по-другому? И именно такой вариант ответа на stackoverflow набрал больше всего плюсов?
соглашусь с xkor, большинство вопросов закрываются через getChildFragmetnManager и проблем особо ни каких замечено не было.
На счет Single activity, как мне кажется тут думать надо, а не лепить слепо. И для каждого проекта, прорабатывать, продумавать ваш UX, лично для себя понял, что single activity, это решение для не больших app, если же app идет со сложным и загруженым UX, ни какого single activity, иначе протом проблем будет больше чем, пользы от этого решения. А если еще нужно разделеить экраны на темы, с разными цвтовыми гамами и шрифтами, то тогда точно ни какого single activity.
А если еще нужно разделеить экраны на темы, с разными цвтовыми гамами и шрифтами, то тогда точно ни какого single activity.


Спасибо КЭП
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории