Administración del ciclo de vida de Android de fragmentos dentro de ViewPager y FragmentPagerAdapter

He estado luchando para averiguar cuál es el manejo correcto de los Fragmentos dentro de unFragmentActivity con unViewPager es. Antes de entrar en detalles, un resumen rápido del problema al que me enfrento es el siguiente:

tengo unFragmentActivity con unViewPager. losViewPager Utiliza una costumbre, pero muy simple.FragmentPagerAdapter. CadaFragment dentro deViewPager comprende de unExpandableListView. También tengo un botón de la barra de acción llamado "Actualizar". Por ahora, supongamos que laViewPager tiene solo unoFragment. Se crea la actividad, y laFragmentesExpandableListView Está poblado (hasta ahora todo bien). Cuando se hace clic en el botón Actualizar, el método de manejo dentro de laFragmentActivity itera sobre la lista deFragments que están asignados al FragmentPagerAdapter y llamadasrefresh() en cadaFragment para rellenar su ListView. Sin embargo, cuando la orientación del dispositivo cambia (por ejemplo, de vertical a horizontal), la actividad se recrea y los fragmentos también. Al hacer clic en el botón Actualizar ahora se repetirá sobre no inicializadoFragments.

Sé que estoy siendo bastante vago, especialmente sin código de ejemplo, pero por favor, tengan paciencia conmigo. He rastreado el problema y las llamadas de método de la siguiente manera desde el inicio de la aplicación / actividad:

FragmentActivity.onCreate()FragmentActivity.setContentView()FragmentActivity.createPagerFragments() <: esto crea un ArrayList of Fragments y los asigna a un nuevo FragmentPagerAdapter que a su vez está asignado al ViewPager.Fragment.onAttach()Fragment.onCreate() <- nada especial aquí, simplemente llamando al súper método.Fragment.onCreateView() <- nada especial aquí tampoco, simplemente inflando el diseñoFragment.onActivityCreated() <- nada aquí tampoco.<< Todo bien, la orientación cambia aquí >>FragmentActivity.onCreate()Fragment.onAttach()Fragment.onCreate()FragmentActivity.setContentView()FragmentActivity.createPagerFragments()Fragment.onCreateView()Fragment.onActivityCreated()<< Actualizar botón pulsado >>FragmentActivity.refresh() <- itera sobre los Fragmentos recién creados del # 13 (¡no estos de Android!).<< Crash: NullPointerException para mExpandableListView en Fragmento. >>

Entonces, el problema, como lo veo, es el siguiente: cuando Android recrea elFragmentActivity y esViews después de un cambio de orientación de la pantalla (llamadas # 9-15 arriba), se crea una nuevaFragment Objetos con su estado restaurado a lo que eran los originales. Sin embargo, estos parecen estar completamente gestionados por elFragmentManager, y no por elFragmentPagerAdapter. En contraste, cuando elFragmentPagerAdapter es recreado junto con elFragments en la actividad deonCreate método (ver llamada # 13) elFragments que se asignan al adaptador nunca tienen suFragment.onCreate() oFragment.onCreateView() Métodos llamados a todos. Entonces, cuando se llama al método refresh () (ver # 17), el método se repite sobre estosFragments Que no se han inicializado. Por lo tanto, cuando intentan poblar elExpandableListView, la variable de instancia de la vista esNULL. Esto es de esperar ya que la variable de instancia solo se asigna en elFragment.onCreateView() Método que nunca se llama en estosFragments.

Así que mi pregunta es: ¿Cómo se puede reutilizar correctamente la recreación (por Android)?Fragments ¿Después de que la orientación de la pantalla haya cambiado para evitar crear nuevas que no se inicialicen? Necesito tener una referencia válida a ellos para poder llamar a su método refresh () que los llena a pedido. Idealmente, también deberían ser asignados a laFragmentPagerAdapter también.

Espero haber sido claro al describir el problema, y ​​la razón por la que no he proporcionado el código de ejemplo es porque el problema (como se puede ver) no proviene del código en sí, sino de una recreación bastante incorrecta (aparentemente) de Fragmentos. en lugar de reutilizar Pero si es necesario, te puedo dar un código de muestra, solo de esta manera sería más claro.

¡Gracias!

Respuestas a la pregunta(3)

Su respuesta a la pregunta