Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Mover fragmento de Android a un contenedor diferente No se puede cambiar el identificador de contenedor de fragmento

Esto es lo que me gustaría que mi aplicación hiciera en una tableta. Fragmento (0) tiene algún menú que mostraría fragmentos (1) … (n) así:

----------------- | | | | | | | | | | |(0)| X | X | X | | | | | | | | | | | ----------------- becomes ----------------- | | | | | | | | | | |(0)|(1)| X | X | | | | | | | | | | | ----------------- and then ----------------- | | | | | | | | | | |(0)|(2)|(1)| X | | | | | | | | | | | ----------------- etc... 

Fragmento0 nunca se mueve, los otros se desplazan a la derecha. Los fragmentos que salen del borde de la derecha serán destruidos.

Así que configuro mi diseño XML con un LinearLayout horizontal y que contiene 4 FrameLayout con los IDs adecuados (fragment0 … fragment3)

Puedo instanciar y mostrar fragment0 y luego fragment1, pero no soy capaz de cambiar a la derecha después, me sale:

 ERROR/AndroidRuntime(343): FATAL EXCEPTION: main java.lang.IllegalStateException: Can't change container ID of fragment ... 

Las únicas preguntas relacionadas que he encontrado son este y que uno , probado todas las diferentes soluciones ofrecidas sin suerte.

Probado FragmentTransaction.remove() seguido de .add() , intentado .replace() , probado en diferentes órdenes y para cometer a medio camino (incluso tratando de cometer dos veces como alguien sugirió), trató de llamar addToBackStack() . Todavía no hay suerte.

La pregunta es si es posible mover los fragmentos como este con un FragmentTransaction. En caso afirmativo, ¿qué estoy haciendo mal (y bonificación, es posible animar eso?). Si no, ¿cuál sería la manera correcta de implementar esto?

Tenga en cuenta que no quiero volver a instanciar los fragmentos cada vez (cada uno hacer algunas consultas en la web que puede tomar algún tiempo). Es posible extraer todos los datos de vuelta a la actividad para recrear uno, pero prefiero no hacerlo si es posible …

2 Solutions collect form web for “Mover fragmento de Android a un contenedor diferente No se puede cambiar el identificador de contenedor de fragmento”

No sé si esto es lo que quieres, pero hice una pequeña muestra con respecto a tu problema. Básicamente, estarás haciendo el cambio correcto usando el archivo de diseño, teniendo un contenedor de contenedor para cada uno de esos fragmentos que cambian. La muestra de código es un poco grande para una respuesta, así que he publicado en una esencia que se puede encontrar aquí . En esa muestra presione cada uno de los ListFragment del ListFragment (Fragmento 1 -> Fragmento 2 -> fragmento 3) para ver el comportamiento.

Si el contenedor del fragmento se puede cambiar usando la función remove() .

El problema aquí es commit() . Es una llamada asincrónica, y lo programará para que esté en el hilo principal. Por lo tanto, para forzar el FragmentManager a hacer esto inmediatamente antes de añadirlo al otro contenedor.

Para ello tendremos que utilizar la función executePendingTransactions() . Después de llamar a esto, intente agregar el fragmento al nuevo contenedor.

Docs: executePendingTransactions ()

Ejemplo de código:

 FragmentManager fManager = getSupportFragmentManager(); FragGroups fragGroups = (FragGroups) fManager.findFragmentByTag("groups"); if (fragGroups != null) { fManager.beginTransaction().remove(fragGroups).commit(); fManager.executePendingTransactions(); } else { fragGroups = new FragGroups(); } if (mTwoPane) { fManager.beginTransaction().replace(R.id.fragment_container_groups, fragGroups, "groups").commit(); } else { fManager.beginTransaction().replace(R.id.fragment_container, fragGroups, "groups").commit(); } 

Disfrutar. Se agradece la retroalimentación

Editar

Me gustaría añadir un punto aquí. Como yo tenía el mismo problema, se encontró con este hilo y aplicado los cambios sugeridos. El problema persistió. A continuación, busqué en el último comentario en este hilo que resolvió mi problema: eliminar addToBackStack() método al realizar una transacción o si intencionalmente uso, quitar el fragmento de la pila trasera antes de agregar a otro contenedor. Espero que ayude al futuro lector.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.