Removendo programaticamente um ViewPager, quando são (ou como posso garantir) contidos fragmentos são destruídos?
Tendo pesquisado antecipadamente sobre esse problema, posso encontrar muitas discussões sobre como adicionar e remover dinamicamenteFragment
s de umViewPager
. O que eu estou realmente preocupado aqui, no entanto, é como eu posso remover programaticamente um todoViewPager
'limpa' da sua contendoViewGroup
quando issoViewPager
foi usado para exibirFragment
s através de umFragmentPagerAdapter
e garantir que osFragment
s são destruídos corretamente.
Para expandir um pouco mais a questão, eu tenho um layout de dois painéis de paisagem, onde uma seleção é feita a partir de uma lista dentro de umFragment
no lado esquerdo, e o conteúdo escolhido é colocado à direita dentro de umFrameLayout
. O principal é que o conteúdo pode ou não ser paginado. Portanto, o conteúdo deve ser exibido em umViewPager
formato ou, se não for paginado, será representado por um únicoFragment
diretamente.
Para mostrar um únicoFragment
, Eu simplesmente faço umaFragmentTransaction
como faria normalmente para colocar oFragment
noFrameLayout
recipiente. Se, por outro lado, é paginado conteúdo para ser mostrado, em vez disso eu criar umViewPager
e adicioná-lo como um filho doFrameLayout
.
Quando preciso alterar o conteúdo, se o conteúdo anterior foi autônomoFragment
então eu posso simplesmente removê-lo viaFragmentTransaction
.remove()
. Quando faço isso, oFragment
atravessa oonPause()
...onDestroy()
ciclo como esperado. Se o conteúdo anterior era umViewPager
então eu removê-lo doFrameLayout
usando.removeAllViews()
. Aqui chego ao problema: não vejo nenhum dosonPause()
...onDestroy()
métodos sendo chamados em qualquer um dosFragment
s que foram realizadas dentro desseViewPager
através doFragmentPagerAdapter
.
Do ponto de vista do usuário, o aplicativo funciona bem. Depois de várias rodadas deViewPager
sendo removido, vejo o GC recuperando a memória. No entanto, eu não gosto do fato de que aquelesFragment
Os métodos de fim de vida não são chamados, já que não posso fazer nenhuma limpeza dentro deles, e isso não parece "certo".
Existe um método que eu posso ligar para remover oViewPager
'sFragment
s quando oViewPager
é separado de seu pai, talvez? Em outras palavras, quando eu sei que oViewGroup
não está mais em uso, eu fariaFragmentTransaction
s em algum lugar (talvez noFragmentPagerAdapter
) para remover osFragment
s.
Alternativamente, eu percebo que eu poderia apenas manter oViewPager
à direita permanentemente, e trocar dinamicamente oFragment
está dentro dele. É claro que simplesmente não importaria que em certos momentos isso pudesse conter apenas uma página. Se esta seria uma maneira melhor de ir, então eu devo refatorar meu código para fazer isso, mas gostaria de receber opiniões.