AS
Size: a a a
AS
IQ
K
N
MG
JM
N
AT
N
M
B
K
AS
MN
MZ
A
FirstFragment, который был добавлен(показан) из своего Activity, а также был добавлен в backstack, делает сетевой запрос и показывает данные. После некого действие, оно заменяется SecondFragment-ом. Как теперь опять показать FirstFragment, не делая опять network request и не теряя view's state?(например, scroll position)Activity, но не получается решить эту проблему. Сделать переход с FirstFragment на SecondFragment довольно легко, например: activity?.let {
it.supportFragmentManager.beginTransaction().replace(R.id.root, SecondFragment.newInstance(), "second-tag") .addToBackStack(null).commit()
}SecondFragment, обратно на FirstFragment? Можно сделать вот так:activity?.let {
it.supportFragmentManager.popBackStack()
// или it.onBackPressed()
}FirstFragment создается заново. Видимо, это есть хорошо, так как Android не хранит view Fragment-а, который уже не виден юзеру. Так как использовалась addToBackStack, насколько я понял, можно заюзать тот же instance FirstFragment-а. А это значит что есть доступ к тем же переменным и данным из FirstFragment-а. Но жизненный цикл FirstFragment вызывается заново, а значит и вызывается мой запрос в сеть, который лежит в onActivityCreated. Хотелось бы этого избежать и не делать очередной запрос. Что я накопал сам? Во-первых, это методы show/hide. Можно их использовать и быть счастливым навсегда, но видимо, для memory это не есть хорошо. Мне так кажется что их никто не юзает и все пользуется replace-ом. Во-вторых, можно колдавать с флагами, типа, "не делай запрос, так как этот Fragment уже был показан". Но мне кажется это костылем и глупостью. На самом деле, можно избежать повторного запроса в сеть, подписавшись на LiveData во ViewModel и получить актуальные уже данные. Но видимо view state все равно теряется, например, scroll position в RecyclerView. Это кажется не особо удобным. Все таки, как решаются такие ситуации? Спасибо!JM
FirstFragment, который был добавлен(показан) из своего Activity, а также был добавлен в backstack, делает сетевой запрос и показывает данные. После некого действие, оно заменяется SecondFragment-ом. Как теперь опять показать FirstFragment, не делая опять network request и не теряя view's state?(например, scroll position)Activity, но не получается решить эту проблему. Сделать переход с FirstFragment на SecondFragment довольно легко, например: activity?.let {
it.supportFragmentManager.beginTransaction().replace(R.id.root, SecondFragment.newInstance(), "second-tag") .addToBackStack(null).commit()
}SecondFragment, обратно на FirstFragment? Можно сделать вот так:activity?.let {
it.supportFragmentManager.popBackStack()
// или it.onBackPressed()
}FirstFragment создается заново. Видимо, это есть хорошо, так как Android не хранит view Fragment-а, который уже не виден юзеру. Так как использовалась addToBackStack, насколько я понял, можно заюзать тот же instance FirstFragment-а. А это значит что есть доступ к тем же переменным и данным из FirstFragment-а. Но жизненный цикл FirstFragment вызывается заново, а значит и вызывается мой запрос в сеть, который лежит в onActivityCreated. Хотелось бы этого избежать и не делать очередной запрос. Что я накопал сам? Во-первых, это методы show/hide. Можно их использовать и быть счастливым навсегда, но видимо, для memory это не есть хорошо. Мне так кажется что их никто не юзает и все пользуется replace-ом. Во-вторых, можно колдавать с флагами, типа, "не делай запрос, так как этот Fragment уже был показан". Но мне кажется это костылем и глупостью. На самом деле, можно избежать повторного запроса в сеть, подписавшись на LiveData во ViewModel и получить актуальные уже данные. Но видимо view state все равно теряется, например, scroll position в RecyclerView. Это кажется не особо удобным. Все таки, как решаются такие ситуации? Спасибо!M
replace не пробовал add использоватьK
K
