1. ¿Qué es la fragmentación?
Fragment es una nueva API introducida después de Android 3.0. Su intención original es adaptarse a tabletas de pantalla grande. Por supuesto, sigue siendo el favorito del diseño de interfaz de usuario de aplicaciones para tabletas, y también agregaremos este Fragment al desarrollo de teléfonos móviles comunes. Podemos considerarlo como una pequeña Actividad, ¡también conocida como fragmento de Actividad!
La siguiente imagen es una imagen procesada de un fragmento correspondiente a un teléfono móvil y una tableta respectivamente.
2. Cómo utilizar fragmentos
2.1 Fragmento de carga estática
Paso 1:
definir un archivo xml de fragmento
Lo que definí es left_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:id="@+id/button"
android:text="Button"
/>
</LinearLayout>
Paso 2:
personalice una clase Fragment, debe heredar Fragment o sus subclases, reescribir el método onCreateView(),
llamar a este método: el método inflater.inflate() carga el archivo de diseño de Fragment y luego devuelve el objeto de vista cargado
- Al heredar Fragment, habrá dos Fragments en diferentes paquetes para que elijamos (como se muestra en la figura siguiente):
uno es androidx.fragment.app.Fragment en la biblioteca de AndroidX y el otro es android.app integrado. .Fragmento del sistema. Aquí elegimos AndroidX Fragment en la biblioteca, porque puede hacer que las características de Fragment sean consistentes en todas las versiones del sistema Android, y el Fragmento integrado del sistema se abandonó en la versión Android 9.0.
//这里的名字就叫LeftFragment
public class LeftFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.left_fragment,container,false);
return view;
}
}
Paso 3 :
Agregue la etiqueta del fragmento al archivo de diseño correspondiente a la Actividad que necesita cargar el Fragmento. Recuerde, el atributo de nombre es un nombre de clase completo, que debe incluir el nombre del paquete del Fragmento.
<fragment
android:id="@+id/left_fragment"
android:name="com.example.fragmenttest.LeftFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
Paso 4: ¡
La actividad llama a setContentView() en el método onCreate() para cargar el archivo de diseño!
2.2 Agregar fragmentos dinámicamente
Proceso de implementación
2.3 Devolver pila en fragmento
Hemos implementado con éxito la función de agregar fragmentos dinámicamente a la actividad, pero si lo prueba, encontrará que después de agregar un fragmento haciendo clic en el botón, presione la tecla Atrás y el programa saldrá directamente. Si queremos imitar el efecto similar a regresar a la pila, presionar la tecla Atrás para regresar al fragmento anterior, ¿cómo lograrlo?
De hecho, es muy simple: FragmentTransaction proporciona un método addToBackStack (), que se puede usar para agregar una transacción a la pila de retorno y modificar el código en MainActivity, como se muestra a continuación.
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
2.4 Gestión de fragmentos y asuntos de fragmentos
2.5 Interacción entre Fragmento y Actividad
- adquisición de componentes
Fragmento obtiene componentes en Actividad: getActivity().findViewById(R.id.list);
Actividad obtiene componentes en Fragmento (según id y etiqueta): getFragmentManager.findFragmentByid(R.id.fragment1);
-
Transferencia de datos
①La actividad transfiere datos a Fragmento:Cree un paquete de datos de paquete en la Actividad, llame a setArguments (paquete) de la instancia de Fragmento para pasar el paquete de datos de Paquete al Fragmento, y luego llame a getArguments en Fragmento para obtener el objeto Paquete y luego analícelo.
②Fragmento transfiere datos a Actividad
1. Defina una interfaz en Fragment, defina un método abstracto en la interfaz y establezca el tipo de parámetro de datos que desea pasar, 2. Luego escriba un
método abstracto para llamar a la interfaz y pase los datos que se pasarán
3. Luego ¡Es Actividad, llame al método proporcionado por Fragmento y luego lea los datos al reescribir el método abstracto!③Transferencia de datos entre Fragmento y Fragmento
Encuentre el objeto de fragmento para recibir datos y llame directamente a setArguments para pasar los datos.
Por lo general, al reemplazar, es decir, cuando el fragmento salta, los datos se pasan, luego solo necesita llamar a su método setArguments después de inicializar el Fragmento para ser saltado. ¡Simplemente ingrese los datos!
Si dos Fragmentos necesitan transmitir datos inmediatamente en lugar de saltar, primero debe obtener los datos transmitidos por f1 en la Actividad y luego transmitirlos a f2, que es usar la Actividad como medio.
3. Ciclo de vida del fragmento
3.1 El estado de los fragmentos
- Estado de ejecución
Un fragmento se está ejecutando cuando es visible y su actividad asociada se está ejecutando. - Estado suspendido
Cuando una actividad entra en estado suspendido (porque se agrega otra actividad que no llena la pantalla en la parte superior de la pila), el fragmento visible asociado con ella entra en estado suspendido. - Estado detenido
Cuando una actividad ingresa al estado detenido, los fragmentos asociados con ella ingresarán al estado detenido, o los fragmentos se eliminarán de la actividad llamando a los métodos remove() y replace() de FragmentTransaction , pero si la transacción se confirma before Llame al método addToBackStack () y los fragmentos también entrarán en el estado de parada en este momento. En general, los fragmentos que entran en estado detenido son completamente invisibles para el usuario y el sistema puede reciclarlos. - Los fragmentos del estado destruido
siempre existen adjuntos a la actividad, por lo que cuando la actividad se destruye, los fragmentos asociados con ella entrarán en el estado destruido . O elimine el fragmento de la actividad llamando a los métodos remove() y replace() de FragmentTransaction, pero el método addToBackStack() no se llama antes de que se confirme la transacción, y el fragmento también entrará en el estado de destrucción en este momento.
Existen casi todos los métodos de devolución de llamada en la actividad, pero los fragmentos también proporcionan algunos métodos de devolución de llamada adicionales, así que centrémonos en estas devoluciones de llamada:
- enAttach(). Se invoca cuando un fragmento está asociado con una actividad.
- onCreateView(). Se llama cuando se crea una vista (se carga el diseño) para un fragmento.
- onActivityCreated(). Se llama cuando se garantiza que se debe haber creado la actividad asociada con el fragmento.
- onDestroyView(). Se llama cuando se elimina la vista asociada con el fragmento.
3.2 El proceso del ciclo de vida.
3.3 Proceso del ciclo de vida bajo operaciones comunes
① Cuando Activity carga Fragment , llame a los siguientes métodos a su vez: onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart ->onResume
②Cuando creamos una Actividad suspendida con estilo de diálogo , u otras, es para hacer visible la Actividad donde se encuentra el Fragmento, pero no para enfocar la Pausa.
③Cuando se cierra el cuadro de diálogo, la Actividad vuelve a centrarse : onResume
④ Cuando reemplazamos Fragment y llamamos a addToBackStack() para agregarlo a la pila trasera onPause -> onStop -> onDestoryView. !¡¡¡Tenga en cuenta que el Fragmento no ha sido destruido en este momento!!!
⑤ Cuando presionamos el botón Atrás en el teclado , Fragment se mostrará nuevamente: onCreateView -> onActivityCreated -> onStart -> onResume
⑥Si después de reemplazar, no se llama al método addToBackStack() para agregar el Fragmento a la pila de actividades antes de confirmar la transacción; o si se sale de la Actividad, el Fragmento finalizará por completo y el Fragmento entrará en el estado de destrucción en Pausa. > onStop - > onDestoryView -> onDestory -> onDetach
Referencia de contenido: "La primera línea de código" - Guo Lin