Cómo obtener Fragmento al reanudar la Actividad
Este artículo analiza principalmente cómo obtener Fragmento al reconstruir la Actividad.
Este artículo se centrará en cómo obtener Fragmento al reconstruir la Actividad, de la siguiente manera:
Específicamente, existen cuatro métodos para obtener Fragmento reutilizable.
A continuación se analizarán estas cuatro situaciones por separado.
En primer lugar, para resumir, no se recomienda utilizar este método para obtener Fragment.
Fragment no solo es el portador de la interfaz, sino que también se puede utilizar para implementar el ciclo de vida del monitoreo, porque su ciclo de vida es el mismo que el de la Actividad Cuando no podemos monitorear el ciclo de vida. Actividad, podemos usar Fragmento para monitoreo auxiliar. La biblioteca de carga de imágenes Glide y ViewModel en Android Jet Pack utilizan este patrón.
Hace algún tiempo, encontré un error de este tipo
Se produjo una excepción de conversión de tipo y no se pudo forzar FragmentA a FragmentB.
En ese momento, estaba desconcertado sobre por qué ocurrió este problema, obviamente agregué Fragmentos al FragmentManager en el orden en que estaban.
Hasta que imprimí el código de getFragments. Cuando obtuve la lista de Fragmentos de FragmentManager, me di cuenta de que el orden de los Fragmentos no era el mismo que el orden en que los agregué a FragmentManager.
Es decir, debido a que los fragmentos obtenidos de getFragments contienen fragmentos que no necesita y el tiempo de inicialización de estos fragmentos es impredecible, no puede determinar los fragmentos que necesita en la lista de fragmentos. El autor del artículo de referencia, Kidou, se encontró con esta situación, así que escribí sobre ello de pasada.
En la versión 25, getFragments devolvió null cuando la Actividad era nueva, y en la versión 26, getFragments devolvió Collections.EmpytList().
Esto resultó en un error en la rutina inicial de decisión basada en nulos.
Este método consiste en encontrar el Fragmento a través del id definido por el Android:id del ViewGroup en el que se encuentra. Esto es aplicable al caso en el que solo hay un Fragmento en un ViewGroup.
Por supuesto, también puede utilizar este método si hay varios Fragmentos en ViewGroup, pero en este momento obtendrá el último Fragmento agregado al ViewGroup.
Este método se utiliza para manejar situaciones en las que findFragmentById no es aplicable. Porque busca el fragmento por etiqueta y la identificación de ViewGroup es inútil.
Cosas a tener en cuenta:
Existe una situación en la que getFragmentById y getFragmentByTag no se pueden usar, es decir, usar ViewPager para administrar Fragment.
Este método está disponible, pero usar fm.putFragment y fm.getFragment para manejar esta situación es demasiado engorroso.
El uso de estos dos métodos es el siguiente:
Algunos amigos pueden pensar que esto es demasiado similar a getFragmentByTag y parece que no hay diferencia.
La clave del problema es que debido a que ViewPager controla la adición y eliminación de fragmentos en ViewPager, métodos como
no se pueden usar porque no se pueden configurar al agregar fragmentos. No podemos obtener FragmentByTag directamente desde la lista de fragmentos en FragmentManager a través de etiquetas.
Entonces, ¿cómo hacen esto los métodos putFragment y getFragment?
Echemos un vistazo al código fuente de estos dos métodos:
A través del código fuente anterior, podemos ver que putFragment almacena la etiqueta y el mIndex del fragmento que se almacenará como un conjunto de datos En el paquete, y luego en el método getFragment, primero obtenga el mIndex de la Etiqueta correspondiente del paquete y finalmente recupere el Fragmento correspondiente de mActive de acuerdo con este mIndex.
mActive es el objeto que realmente almacena el Fragmento, pero no podemos recuperarlo directamente usando Tag porque ViewPager usa mIndex como valor clave para almacenar el Fragmento. ViewPager utiliza mIndex como valor clave para almacenar fragmentos. Por lo tanto, solo podemos recurrir a la siguiente mejor opción y asociar Tag con mIndex para lograr el efecto de usar Tag indirectamente para recuperar Fragmento.
A continuación se muestra una ilustración del código fuente y los pasos:
Nota:
Referencia: ¿Realmente sabes cómo usar Fragmentos?