Fragmentos de Android: problemas y errores comunes.Original… | Por Wisemuji | Marzo 2022
original: https://levelup.gitconnected.com/android-fragments-common-queries-and-mistakes-915b4a1f34ce
Este artículo es una traducción/resumen del artículo anterior, todos los derechos de autor pertenecen al autor original amod kanthe.
La clase Fragment de Android se usa para crear interfaces de usuario dinámicas y debe usarse en Activity. La mayor ventaja de usar Fragmentos es que simplifican la tarea de crear interfaces de usuario para varios tamaños de pantalla. (Una Actividad puede contener cualquier número de Fragmentos)
en el texto Errores comunes y problemas encontrados al usar Fragmentosexplicar
Nota: Se supone que el lector tiene el conocimiento básico de Fragment y el conocimiento de la devolución de llamada de Lifecycle.
getSupportFragmentManager
Se utiliza principalmente para la actividad. Necesario para usar ViewPager, BottomSheetFragment y DialogFragment en una actividad.
getChildFragmentManager
Se usa cuando se usa ViewPager dentro de Fragment.
en el fragmentogetSupportFragmentManager
Los problemas más importantes en el proceso de uso pérdida de memoriaSi. Pila de fragmentos utilizada en ViewPager getSupportFragmentManager
Después de su uso, acumular en Actividad.cerrar fragmento principal ‘cierre’ Pero dado que todos los fragmentos secundarios están activos y se mantienen en la memoria ‘destruir’No sucede que todos estos fragmentos pierdan memoria porque no solo el fragmento principal sino todos los fragmentos secundarios no se pueden borrar de la memoria del montón.
así en el fragmento getSupportFragmentManager
No utilice
Cuando usa DialogFragment, ChildFragment, BottomSheetFragment, a veces necesita pasar algo al fragmento principal. La mejor manera es crear una devolución de llamada.
Simplemente agregue el código anterior al Fragmento secundario. También se puede usar en Fragmentos secundarios en ViewPager.
FragmentPagerAdapter
Almacene todo el Fragmento en la memoria, por lo que si ViewPager usa muchos Fragmentos, sobrecarga de memoriapuede causar FragmentStatePagerAdapter
Solo guarde fragmentos en SavedInstanceState y destruya todos los fragmentos cuando pierdan el foco.
entonces, Cuando se usan más de 3 fragmentos FragmentStatePagerAdapter
escribir y en otros casos FragmentPagerAdapter
escribir
Echemos un vistazo a algunos problemas comunes que puede encontrar.
ViewPager no está actualizado.
ViewPager Fragment es administrado por FragmentManager en Fragment o Activity, y todas las instancias de ViewPager Fragment se almacenan en FragmentManager.
Por lo tanto, si ViewPager no se actualiza, podría ser un problema que FragmentManager todavía tenga la instancia anterior de Fragment.en momentos como este notifyDataSetChanged
Las funciones son útiles.
Debe acceder al Fragmento actual desde ViewPager.
Proporcionado por FragmentStateAdapter y FragmentPagerAdaptersetPrimaryItem()
Se recomienda configurar el Fragmento actual usando una función llamada (ejemplo)
replace
Elimine los fragmentos existentes y agregue otros nuevos. Es decir, cuando se presiona el botón Atrás, el Fragmento reemplazado se creará usando onCreateView.
add
Mantenga el Fragmento existente y agregue un Fragmento nuevo. Es decir, el fragmento existente no entra en estado de pausa, sino en estado activo.
Cuando el Fragmento actual ya no es necesariosí replace
Puede usar adicionalmente si su aplicación tiene límite de memoria replace
en lugar de add
Considere usar
Al usar el receptor en Fragmento liberar el receptorEn algunos casos, pueden ocurrir pérdidas de memoria por olvido. Si se registró en onCreate o onResume, debe liberarse en onPause o onDestroy.
Además, si varios fragmentos reciben el mismo receptor de transmisión, Tienes que registrarlo en onResume y liberarlo en onPause. Hacer. Si lo libera en onCreate o onDestroy, otros Fragmentos no lo recibirán hasta que se libere el Fragmento.
Al usar BottomBarNavigation y NavigationDrawer, a menudo se ve que se regenera un Fragmento o que se agrega el mismo Fragmento varias veces.
En este caso, incluso FragmentTransaction show
, hide
debe usarse (en lugar de agregar, reemplazar)
(una biblioteca con buenos ejemplos)
Si intenta enviar el fragmento, la aplicación se bloqueará incluso si la actividad no está en estado reanudado. Para evitar esta situación, independientemente de si la actividad o el fragmento se encuentran en estado de reanudación, isAdded()
o isResumed()
deberia ver si hay
Si no te importa mucho el estado del fragmento commitAllowingStateLoss()
puedes usarlo
Cuando use el menú de opciones dentro de un Fragmento, agregue la siguiente línea.
Si está utilizando una barra de herramientas en un Fragmento, puede extender el menú con el siguiente código:
getToolbar().inflateMenu(R.menu.toolbar_menu_gmr);
Alternativamente, puede anular createOptionsMenu, pero prefiero el método anterior porque no depende de la superclase.
Cuando la publicación da como resultado un proceso en segundo plano Cuando el fragmento no se inserta o no está en estado de recuperaciónacceder a una vista dentro de un Fragmento puede generar una excepción NullPointer.
Entonces, al acceder a getView o getActivity después de una tarea o publicación en segundo plano, debe Todas las tareas en segundo plano deben cancelarse al salir Hacer.
No se llama a onActivityResult() de fragmentos anidados. La secuencia de llamada es la siguiente.
Activity.dispatchActivityResult()
.FragmentActivity.onActivityResult()
.Fragment.onActivityResult()
.
Si desea usarlo, debe llamarlo desde el Fragmento o Actividad principal.
Cuando desee pasar parámetros en Fragment, debe usar Bundle en lugar de constructor.
documentación oficial: Todos los Fragmentos deben tener un constructor vacío y se les llama cuando se recarga el estado activo. Cuando se vuelve a crear el fragmento, no se llama al constructor no nulo, por lo que es mejor pasar los parámetros a través del constructor. setArguments(Bundle)
Pasar a getArguments()
mejor pensar en ello como
Antes de enviar FragmentTransaction addToBackStack()
Al llamar, puede asegurarse de que el usuario regrese a la interfaz principal cuando presione la tecla de retorno en el Fragmento actual.
Si hay un objeto FragmentTransaction en la pila posterior y el usuario presiona el botón Atrás, FragmentManager toma la transacción más reciente de la pila posterior y hace lo contrario. (por ejemplo, si acaba de agregar un Fragmento, elimínelo)
Los fragmentos parecen fáciles de manejar a primera vista, pero hay muchas cosas a tener en cuenta, como la memoria, la navegación, las devoluciones de llamada y la agrupación. Esperamos que este artículo cubra algunos de los problemas y errores más comunes que encuentra al usar Fragmentos.