Tecla Atrás en Fragmento añadido mediante programación lleva a contenedor vacío
Tengo un problema con un diseño fragmentado y me disculpo sinceramente si se ha respondido antes y yo era demasiado tonto para encontrarlo. Busqué durante horas y no conseguí nada (bien, conseguí porciones pero nada resuelto mi problema).
Así que aquí está mi configuración: Tengo un diseño de dos paneles utilizando dos FrameLayouts como contenedores para mis fragmentos. Activity_listing.xml:
- El cajón de navegación se cierra al hacer clic
- Android: ¿Puedes anidar Fragmentos?
- ¿Cómo agregar otro fragmento en el fragmento existente?
- Cómo abrir el cajón de navegación en el botón de clic en el fragmento principal?
- Android 4.4 - Estado translúcido / barras de navegación - fitsSystemWindows / clipToPadding no funcionan con transacciones de fragmentos
<FrameLayout android:id="@+id/listing" /> <FrameLayout android:id="@+id/details" />
Al abrir la aplicación (onCreate en la actividad del fragmento), un fragmento llamado Listado se agrega a FrameLayout "listing" mediante programación usando FragmentTransaction.
public class ListingActivity extends FragmentActivity implements ListingFragment.Callbacks { super.onCreate(savedInstanceState); setContentView(R.layout.activity_listing); // Displaying the first listing here ... Fragment fragment = new ListingFragment(); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.add(R.id.listing, fragment); ft.addToBackStack(null); ft.commit(); ... }
Este ListingFragment se reemplaza un par de veces durante el tiempo de ejecución, por lo que tengo que crearlo en lugar de definirlo en XML. He intentado este último con
<fragment android:name="com.example.app.ListingFragment" />
Pero luego no se reemplazará o eliminará mediante programación más adelante. Sólo puedo añadir () y luego la antigua es visible a través de la nueva. Pero ese no es el problema aquí – sólo una explicación para mi camino.
Hasta ahora todo esto funciona como debería, Listado se crea y se muestra, etc, por lo que no hay problemas. Pero:
Cuando ListingFragment se muestra en el inicio y presiono la tecla Back, en la última posición FrameLayout "listing" se vacía en lugar de caer de nuevo a la pantalla de inicio! Me imaginé que tiene que ser porque onCreate de mi ListingActivity mostrar un marco vacío y añadir () un ListingFragment a ella. Así que la pila trasera tiene el marco vacío en ella, también. ¿Derecha?
He intentado resolver la situación por esto a ListingActivity:
@Override public void onBackPressed() { super.onBackPressed(); if(getSupportFragmentManager().getBackStackEntryCount() == 0) { this.finish(); } }
Pero de alguna manera eso no parece ni se siente bien … parece un mal trabajo.
¿Así que hay alguna manera de insertar el fragmento antes de la vista con el FrameLayout vacío está inflada por lo que no hay estado vacío para "volver" a? ¿O es posible eliminar el estado "vacío" de la pila trasera aunque no esté en él? Cualquier otra idea sobre cómo evitar el marco vacío después de golpear "atrás"?
¡Muchas gracias por sus esfuerzos por adelantado!
- Uso de RoboFragment con FragmentManager
- El fragmento es transparente y muestra la actividad a continuación
- Fragmentos en ViewPager se recrean
- Fragmento de la fuerza de Android para reconstruir Ver
- Android Fragments getView devolver el padre de la vista?
- Se puede crear un fragmento con una sola instancia
- Cuando se aplica onBackPressed en Fragment que extiende el diálogo Fragment
- Reemplazar un fragmento mediante programación
No llame a ft.addToBackStack(null)
cuando agrega el fragmento en onCreate. Eso le dice al FragmentManger que tienes otro estado ANTES de ese fragmento que deseas poder volver a saltar.
- Forma personalizada mientras conversas en android usando un archivo xml
- ¿Por qué la aceleración de hardware no funciona en mi vista?