vida tutorial studio navegar fragments example entre desde ciclo boton activity abrir android android-fragments

studio - fragments android tutorial



¿Cuándo llamar a initLoader en Fragmento? (4)

Tengo un fragmento bastante simple con ListView, CursorLoader y CursorAdapter. Todo está en una sola actividad (solo cambiando fragmentos). Mi problema es que se llama a onLoadFinished () en algunas situaciones dos veces según el lugar donde puse la llamada initLoader (). Esas situaciones son:

  • cambio de configuración (pantalla giratoria, etc.)
  • reemplazando el fragmento actual con otro usando FragmentTransaction y luego regresando (haciendo estallar backstack). En este caso el fragmento de detalle de un elemento de la lista.

Cuando se coloca initLoader () en onCreateView (), onActivityCreated () (recomendado en la documentación) onLoadFinished () se llama dos veces después del cambio de configuración. Hay una explicación de por Rudik Krasniynos . Pero onLoadFinished () se llama solo una vez cuando se extrae un fragmento más nuevo de backstack.

Cuando initLoader () se coloca en el método onResume () / onStart (), la situación anterior se invierte. Dos llamadas onLoadFinished () para reventar el backstack y una para el cambio de configuración.

Entonces, la pregunta es dónde o cómo iniciar el cargador sin llamar a onLoadFinished () dos veces o qué hacer para no iniciar el cargador dos veces. ¡Gracias!

Código para reemplazar el fragmento:

FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.root_view, fragment, tag); ft.addToBackStack(null); ft.commit();

Código para CursorAdapter:

//onCreateView MyCursorAdapter mAdapter = new MyCursorAdapter(getActivity(), null, 0); mList.setAdapter(mAdapter); //in other/same lifecycle callbacks getLoaderManager().initLoader(ID, null, this);

Estoy usando la biblioteca de soporte v18.


¿Qué hay de comprobar el savedInstanceState antes de iniciar el cargador.

if (savedInstanceState == null) getLoaderManager().initLoader(LOADER_ID, null, this);


Llámalo en onActivityCreated(Bundle savedInstanceState) en tu fragmento

getLoaderManager().initLoader(LOADER_ID, new Bundle(), this);


Lo llamo en OnCreate y, por lo que sé, esta es la mejor práctica ... Lo estoy usando ahora mismo y todo funciona perfectamente.

@Override protected void onCreate(Bundle savedInstanceState) ....... getSupportLoaderManager().initLoader(LOADER_ID, null, this); ....... }


Para evitar que onLoadFinished sea ​​llamado más de una vez, onResume su cargador en onResume .