¿es posible cambiar de Fragmentos sin volver a crearlos todo el tiempo? ¿Si es así, cómo?Android Honeycomb: ¿Cómo cambiar Fragmentos en FrameLayout, sin volver a crearlos?
In the documentation Encontré un ejemplo de cómo reemplazar Fragmentos.
// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
Pero no quiero crear mis fragmentos del cero cada vez que los necesite.
También encontré this example de ocultar/mostrar fragmentos:
// The content view embeds two fragments; now retrieve them and attach
// their "hide" button.
FragmentManager fm = getFragmentManager();
addShowHideListener(R.id.frag1hide, fm.findFragmentById(R.id.fragment1));
addShowHideListener(R.id.frag2hide, fm.findFragmentById(R.id.fragment2));
Pero ¿cómo iba a crear un fragmento con un ID fuera de un archivo XML?
Creo que esto podría estar relacionado con this question, pero no hay una respuesta. :/
Muchas gracias por adelantado, medusas
Editar:
Eso es como lo estoy haciendo ahora:
Fragment shown = fragmentManager.findFragmentByTag(shownFragment);
//...
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (shown != null) fragmentTransaction.hide(shown);
//switch statetement for menu selection, just one example:
SettingsFragment set = (SettingsFragment) fragmentManager.findFragmentByTag(SET);
Toast.makeText(this, "Settings:" + set, Toast.LENGTH_LONG).show();
if (set == null)
{
set = new SettingsFragment();
fragmentTransaction.add(R.id.framelayout_content, set, SET);
}
else fragmentTransaction.show(set);
shownFragment = SET;
fragmentTransaction.commit();
Si llamo a los ajustes, luego otra cosa, y luego volver a la configuración, la tostada me da "nulo" primero y "Configuración: Fragmento de configuración {40ef ..." segundo.
Sin embargo, si reemplazo fragmentTransaction.add(R.id.framelayout_content, set, SET);
con fragmentTransaction.replace(R.id.framelayout_content, set, SET);
sigo recibiendo "nulo", "nulo", "nulo" ... por lo que no parece encontrar el fragmento por etiqueta.
Edit2:
Adición fragmentTransaction.addToBackStack(null);
hizo el truco. :) Esto ahorra todo el ocultamiento/memorización del fragmento que se muestra como parte, así que supongo que es la solución más elegante para esto.
Encontré this tutorial bastante útil sobre el tema.
Edit3:
En cuanto a mi código me di cuenta que podía deshacerse de algunas partes, por lo que cambió a:
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
if (shown != null) fragmentTransaction.hide(shown);
Settings set = (Settings) fragmentManager.findFragmentByTag(SET);
if (set == null) set = new Settings();
fragmentTransaction.replace(R.id.framelayout_content, set, SET);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Sin embargo, este invoca un IllegalStateException: Fragment already added
, casi de la misma como here. ¿Hay alguna manera fácil de prevenir esto? De lo contrario, creo que podría volver al bit hide/show.
Quiero cambiar entre Fragmentos dependiendo de la selección del menú. Por lo tanto, quiero volver a mostrar el mismo Fragmento nuevamente si está seleccionando el mismo elemento del menú nuevamente. Con "replace" no pude encuentra el Fragmento a través de la etiqueta. – jellyfish
Luego, simplemente me quedo con los fragmentos en la memoria y hago el reemplazo. No veo por qué tienes que encontrar el fragmento dado que puedes rastrear la selección del menú actual y saber qué fragmento es Sin embargo, cuando se selecciona un nuevo elemento de menú, no veo por qué no debería funcionar encontrar el fragmento por etiqueta (he hecho algo similar con un DialogFragment como lo hace, si la memoria sirve, el DialogFragment muestra en API población. – PJL
Entonces, ¿estás sugiriendo que debería mantener un campo de referencia en mi clase para cada Fragmento? Para la otra parte, ve mi edición. – jellyfish