Fragmento de Android: ¿se mueve de una vista a otra?
¿Puedo primero agregar un fragmento a una vista, luego "separarlo" y luego "volver a adjuntarlo" a otra vista?
En código, quiero:
- android.R.id.content como contenedor para Fragment
- Cómo agregar / quitar Fragmento en el botón haga clic?
- La biblioteca de la barra de acciones de AppCompat no muestra fragmentos añadidos
- ¿Cómo funciona el nuevo FragmentTransaction commitNow () trabajando internamente?
- FragmentTransaction.replace reemplaza sólo el primer Fragment en un contenedor
fragOne one = new fragOne(); getSupportFragmentManager().beginTransaction() .add(R.id.left, one, "tag").commit(); getSupportFragmentManager().beginTransaction() .detach(one).commit(); // or .remove(), or .addToBackStack(null).remove() getSupportFragmentManager().executePendingTransactions(); getSupportFragmentManager().beginTransaction() .add(R.id.right, one).commit();
Pero lanza error:
04-05 13:28:03.492: E/AndroidRuntime(7195): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.trybackstack/com.example.trybackstack.MainActivity}: java.lang.IllegalStateException: Can't change container ID of fragment fragOne{40523130 #0 id=0x7f080000 tag}: was 2131230720 now 2131230721
¡Gracias por la ayuda!
- Ciclo de vida del fragmento - ¿Qué método se llama mostrar / ocultar?
- Cambiar el orden z de Fragmentos durante la FragmentTransaction en curso
- ¿Qué hace exactamente FragmentManager y FragmentTransaction exactamente?
- Cómo mostrar el fragmento de entrada sobre el fragmento de salida mientras se anima.
- Fragmento de Android La transacción con animación provoca que el flash blanco
- Cómo agregar un fragmento a un diseño de un DialogFragment?
- Fragmento Transacción cargar la vista vacía, pero el fragmento se muestra después de que el dispositivo giratorio
- Android - Hacer traducciones y objectAnimator en el mismo archivo XML
Tuve el mismo problema, pero encontré que lo que realmente necesitaba era reparar la vista del fragmento y no el fragmento en sí, evitando así cualquier transacción fragmentManager.
View vv = fragment.getView(); ViewGroup parent = (ViewGroup)vv.getParent(); parent.removeView(vv); newparent.addView(vv, layoutParams);
Después de intentar todas las respuestas de preguntas similares, parece que he encontrado una manera de hacer el truco.
Primer problema – realmente tienes que confirmar y ejecutar eliminar la transacción antes de intentar agregar fragmento a otro contenedor. Gracias por eso va a la respuesta de la nave
Pero esto no funciona cada vez. La segunda cuestión es una pila trasera. De alguna manera bloquea la transacción.
Así que el código completo, que funciona para mí se parece a:
manager.popBackStackImmediate(null, manager.POP_BACK_STACK_INCLUSIVE); manager.beginTransaction().remove(detailFragment).commit(); manager.executePendingTransactions(); manager.beginTransaction() .replace(R.id.content, masterFragment, masterTag) .add(R.id.detail, detailFragment, activeTag) .commit();
Supongo que tendrías esto calculado por ahora, pero no veo ninguna respuesta satisfactoria. Por lo tanto, estoy publicando esto para otros que pueden referirse a esto en el futuro.
Si desea mover un fragmento de una vista a otra, haga lo siguiente:
android.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.remove(fragment1); fragmentTransaction.commit(); fragmentManager.executePendingTransactions(); fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.containerToMoveTo, fragment1); fragmentTransaction.commit();
De esta manera usted no tiene que duplicar el fragmento.
Comprueba la solución, necesitas crear la nueva instancia del mismo fragmento e instántela con el estado del fragmento antiguo si quieres guardar el estado del fragmento antiguo.
FragmentTransaction ft = mFragmentManager.beginTransaction(); ft.remove(one); Fragment newInstance = fetchOldState(one); ft.add(R.id.right, newInstance); ft.commit(); //TO fetch the old state private Fragment fetchOldState(Fragment f) { try { Fragment.SavedState oldState= mFragmentManager.saveFragmentInstanceState(f); Fragment newInstance = f.getClass().newInstance(); newInstance.setInitialSavedState(oldState); return newInstance; } catch (Exception e) // InstantiationException, IllegalAccessException { } }
También me he encontrado con ese problema. A veces los fragmentos en movimiento funcionan, a veces hay que crear una nueva instancia. Parece que mover fragmentos no funciona, si el fragmento sigue siendo en el estado "isRemoving". Ser removido también parece ser evitado por tener un fragmento en el backstack.
Añadiendo al Yan. La respuesta de Yurkin . Asegúrese de no tener transiciones aplicadas a la transacción ya que parecen retrasar el fragmento de ser desvinculado.