Gerenciamento do Ciclo de Vida do Android de Fragmentos no ViewPager e no FragmentPagerAdapter
Eu tenho lutado para descobrir o que o gerenciamento correto de fragmentos dentro de umFragmentActivity
com umViewPager
é. Antes de entrar em detalhes, um breve resumo do problema que estou enfrentando é o seguinte:
eu tenho umFragmentActivity
com umViewPager
. oViewPager
usa um costume, mas muito simplesFragmentPagerAdapter
. CadaFragment
dentro doViewPager
compreende umExpandableListView
. Eu também tenho um botão de barra de ação chamado "Atualizar". Por enquanto, vamos supor que oViewPager
tem apenas umFragment
. A atividade é criada e oFragment
'sExpandableListView
é preenchido (até aí tudo bem). Quando o botão Atualizar é clicado, o método de tratamento dentro doFragmentActivity
repete a lista deFragments
que são atribuídos ao FragmentPagerAdapter e chamadasrefresh()
em cadaFragment
preencher seu ListView. No entanto, quando a orientação do dispositivo muda (por exemplo, de retrato para paisagem), a Atividade é recriada e os fragmentos também. Clicar no botão Atualizar agora irá iterar sobre os não inicializadosFragments
.
Eu sei que estou sendo muito vago, especialmente sem código de exemplo, mas por favor, tenha paciência comigo. Eu rastreei as chamadas de problema e método da seguinte maneira desde o início do aplicativo / atividade:
FragmentActivity.onCreate()
FragmentActivity.setContentView()
FragmentActivity.createPagerFragments()
<- isso cria um ArrayList of Fragments e os atribui a um novo FragmentPagerAdapter que por sua vez é atribuído ao ViewPager.Fragment.onAttach()
Fragment.onCreate()
<- nada de especial aqui, apenas chamando o método super.Fragment.onCreateView()
<- nada de especial aqui, apenas inflando o layoutFragment.onActivityCreated()
<- nada aqui também.<< Tudo bem, mudanças de orientação aqui >>FragmentActivity.onCreate()
Fragment.onAttach()
Fragment.onCreate()
FragmentActivity.setContentView()
FragmentActivity.createPagerFragments()
Fragment.onCreateView()
Fragment.onActivityCreated()
<< botão Atualizar clicado >>FragmentActivity.refresh()
<- itera sobre os fragmentos recém-criados do # 13 (não estes pelo Android!).<< Crash: NullPointerException para mExpandableListView em Fragment. >>Então, o problema, como eu vejo, é o seguinte: quando o Android recria oFragmentActivity
e os seusViews
após uma mudança de orientação da tela (chamadas 9-15 acima), ela cria novosFragment
objetos com seu estado restaurado para o que os originais eram. No entanto, estes parecem ser completamente gerenciados peloFragmentManager
e não peloFragmentPagerAdapter
. Em contraste, quando oFragmentPagerAdapter
é recriado junto com oFragments
na atividadeonCreate
método (veja a ligação 13)Fragments
que são atribuídos ao adaptador nunca têm seusFragment.onCreate()
ouFragment.onCreateView()
métodos chamados em tudo. Então quando o método refresh () é chamado (veja # 17) o método itera sobre estesFragments
que não foram inicializados. Portanto, quando eles tentam preencher oExpandableListView
, a variável de instância da vista éNULL
. Isso é esperado, pois a variável de instância é atribuída somente noFragment.onCreateView()
método que nunca é chamado nessesFragments
.
Então minha pergunta é: como fazer corretamente a reutilização da recriação (pelo Android)?Fragments
depois que a orientação da tela mudou para evitar a criação de novas que não foram inicializadas? Eu preciso ter uma referência válida para eles, a fim de chamar seu método refresh () que preenche-os sob demanda. Idealmente, eles também devem ser atribuídos aoFragmentPagerAdapter
também.
Espero ter sido claro ao descrever o problema, e a razão pela qual não forneci código de amostra é porque o problema (como pode ser visto) não é do próprio código, mas de uma recriação de fragmentos bastante incorreta (aparentemente). em vez de reutilizar. Mas, se necessário, posso dar-lhe um código de exemplo, só assim seria mais claro.
Obrigado!