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 peloFragmentManagere 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!

questionAnswers(3)

yourAnswerToTheQuestion