varios tutorial studio pasar parametros navegar llamar fragments example entre diferencia destruir desde activity android android-fragments android-orientation

tutorial - pasar parametros entre fragments android



¿Cómo puedo romper cosas con Fragmentos con setRetainInstance(verdadero) y agregarlos a Backstack? (1)

Respuesta actualizada:

¿Cuáles son los escenarios donde podría meterme en problemas?

Al agregar un Fragment a la pila trasera y pasar un Bundle en el Fragment de onSaveInstanceState() a onCreateView() en el cambio de configuración. Llamar a setRetainInstance(true) establecerá el Bundle en nulo en el cambio de configuración.

(No estoy seguro de que un desarrollador realmente intente esto, ya que usar setRetainInstance(true) hace que onSaveInstanceState() redundante, pero no vi el comportamiento documentado en los documentos de la API, por lo que escribí esta respuesta).

Si se addToBackStack() tanto a addToBackStack() como a setRetainInstance(true) , setRetainInstance() altera parcialmente las llamadas al método del ciclo de vida del Fragment y los valores de los parámetros en los cambios de configuración, en comparación con solo llamar a addToBackStack() .

Específicamente, en la prueba a continuación, ver las diferencias entre llamar solo a addToBackStack() y llamar a setRetainInstance(true) también, y ver qué sucede en el cambio de configuración:

Llamar a addToBackStack() pero no a setRetainInstance(true) ;

  • onCreate() y onDestroy() .
  • un paquete pasado desde onSaveInstanceState() se recibe como un parámetro en onCreateView() .

Llamando tanto a addToBackStack() como a setRetainInstance(true) :

  • onCreate() y onDestroy() no se llaman. Esto se menciona en los documentos API.
  • un paquete pasado desde onSaveInstanceState() no se recibe en onCreateView() . El Bundle pasado es nulo.

Una prueba con llamadas de método registradas y parámetros probados para nulo:

En la Activity :

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MyFragment fragment; if (savedInstanceState != null) { fragment = (MyFragment) getFragmentManager().findFragmentByTag("my_fragment_tag"); } else { fragment = new MyFragment(); FragmentTransaction t = getFragmentManager().beginTransaction(); t.addToBackStack(null);//toggle this t.add(android.R.id.content, fragment, "my_fragment_tag").commit(); } }

En el Fragment :

@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setRetainInstance(true);//toggle this }

y

@Override public void onSaveInstanceState(Bundle outState) { outState.putString("test", "value"); super.onSaveInstanceState(outState); }

Prueba 1: Fragmento del ciclo de vida cuando se llama a addToBackStack() , y no se llama a setRetainInstance(true)

  • onAttach ()
  • onCreate ()
  • onCreateView ()
  • onActivityCreated ()
  • onStart ()
  • En resumen()

[Dispositivo girado de vertical a horizontal]

  • en pausa ()
  • onSaveInstanceState ()
  • onStop ()
  • onDestroyView ()
  • onDestroy ()
  • onDetach ()
  • onAttach ()
  • onCreate ()
  • onCreateView () con paquete param! = null
  • onStart ()
  • En resumen()

Prueba 2 y 3: fragmentación de las llamadas del ciclo de vida con setRetainInstance(true) llamada, addToBackStack() llamada / no llamada (mismo resultado):

  • onAttach ()
  • onCreateView ()
  • onActivityCreated ()
  • onStart ()
  • En resumen()

[Dispositivo girado de vertical a horizontal]

  • en pausa ()
  • onSaveInstanceState ()
  • onStop ()
  • onDestroyView ()
  • onDetach ()
  • onAttach ()
  • onCreateView () con paquete param == null
  • onStart ()
  • En resumen()

los documentos en setRetainInstance dicen:

Esto solo se puede usar con fragmentos que no estén en la parte posterior de la pila.

Así que empecé a jugar con eso.

Tengo una actividad con agrega el primer fragmento A

FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.content, new PackageFragment()); ft.commit

luego desde este fragmento ejecuto un método de la actividad principal que agrega el fragmento B a backstack

FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.content, new OrderFragment()); ft.addToBackStack(null); ft.commit();

luego creo log msg de onCreate, onDestroy, onSaveInstanceState, onActivityCreated ... etc

Intento dos versiones de este proceso. Girando el dispositivo en cada fragmento.

  1. defecto

Todo es como se esperaba. onCreate, onDestroy sobre fragmentos de fuego

  1. setRetainInstance (true)

¿Todo es como se esperaba ?. onCreate, onDestroy en fragmentos no disparan

y todo parece funcionar mientras los fragmentos están en el backstack ... entonces, ¿por qué los documentos dicen que no debo usarlo? ¿Cuáles son los escenarios donde podría meterme en problemas?

Gracias