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:

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!

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.

  • ¿Cómo se manejan las transacciones de fragmentos cuando el estado de la actividad principal está destinado a ser guardado?
  • Congelación de la interfaz de usuario cuando la transacción de fragmentos
  • No se encontró ninguna vista para id - DialogFragment + Fragment
  • Se hace clic en un diseño invisible detrás del fragmento:
  • Java.lang.IllegalArgumentException: No se encontró ninguna vista para id 0x1020002 (android: id / content) para el fragmento
  • Android: Fragmento de diálogo y problemas de Backstack
  • ViewPager dentro de Fragmento desaparece después de transaction.remove () (Mantener instancia?)
  • El artículo de DrawerLayout hace clic - ¿Cuándo es el momento adecuado para reemplazar el fragmento?
  • Android TextInputLayouts perder texto / contenido al volver en la transacción de fragmentos
  • Salir de la animación no funciona; FragmentTransaction animación personalizada no funciona para ocultar
  • Cómo borrar backStack de soporte FragmentManager?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.