La actividad contiene múltiples soluciones de implementación de salto y reversión de fragmentos
Hoy en día, existen dos escenarios en los que se utilizan principalmente Fragmentos. Uno es que una aplicación tiene solo una Actividad y muchos Fragmentos. La otra es que cada módulo de la APLICACIÓN es una Actividad con múltiples Fragmentos. Recientemente, es necesario utilizar Fragmentos para reemplazar algunas actividades. Así que piensa en las opciones que tienes.
Requisitos de implementación
El fragmento puede tener una pila como Actividad, y luego el Fragmento se agregará a la pila al saltar. Cuando se presiona la tecla de retorno, la pila se puede devolver. orden.
Al regresar al primer Fragmento, presione la tecla de retorno para finalizar la Actividad.
El título se puede cambiar al saltar y rebobinar.
En cualquier Fragmento, hay un método que devuelve el primer Fragmento.
El diseño es así, primero define una interfaz:
interfaz pública IFragmentCallBack {
/**
* Saltar desde un Fragmento a otro fragmento
*
* @param tag
* @param current
*/
salto vacío (etiqueta de cadena, fragmento base actual);
/**
* Devuelve el primer fragmento
*/
inicio vacío ();
}
Defina una BaseFragmentActivity para implementar esta interfaz, en el método onCreate:
//Manejar situaciones de recuperación de salida de excepción
if (savedInstanceState != null) {
Listlt;Fragmentgt; fragmentos = getSupportFragmentManager().getFragments();
if (fragmentos != null amp; fragments. size( ) gt; 0) {
booleano showFlag = false;
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
for (int i = fragmentos. tamaño() - 1; i gt; = 0; i--) {
Fragmento de fragmento = fragmentos.get(i);
if (fragmento! = nulo) {
if (!showFlag) {
ft.show(fragments.get(i));
showFlag = true;
} else {
ft.hide(fragmentos.get(i));
}
}
}
ft.commit();
}
}
El código anterior es para restaurar F cuando la actividad sale de forma anormal
fragmentar y evitar que los fragmentos se superpongan.
Entre los métodos de interfaz implementados, están home() y jump(). La función principal de home es volver al primer Fragmento. Jump se utiliza para saltar al Fragmento a través de etiquetas.
home se implementa de la siguiente manera:
@Override
public void home() {
while (getSupportFragmentManager().getBackStackEntryCount() != 1) {
getSupportFragmentManager().popBackStackImmediate();
}
}
el salto se implementa de la siguiente manera
@ Override
salto vacío público (etiqueta de cadena, BaseFragment actual) {
transacción FragmentTransaction = getSupportFragmentManager().beginTransaction();
HashMaplt; String, FragmentModulegt; módulos = getFragmentModule();
Destino de BaseFragment = (BaseFragment) getSupportFragmentManager().findFragmentByTag(etiqueta);
if (destino == null) {
destino = módulos.get(etiqueta).getFragment();
transacción.hide(actual)
.add(getContentId(), destino, etiqueta) p>
.addToBackStack(null)
.commit();
} else {
transacción.hide(actual).show(destino) .commit() ;
}
setTitle(modules.get(tag).getTitle());
}
Agregar , Los métodos mostrar y ocultar agregan el Fragmento al BackStack para facilitar la reversión más adelante. FragmentModule, getFragmentModule y getContentId se utilizan arriba. getFragmentModule es un método abstracto que debe ser implementado por la propia subclase. getContentId también es abstracto y se utiliza para proporcionar la identificación del diseño para mostrar Framgent.
FragmentModule:
clase pública FragmentModule {
fragmento de BaseFragment público
título de cadena pública
público; FragmentModule(fragmento BaseFragment, título de cadena) {
this.fragment = fragmento
this.title = título
}
public BaseFragment getFragment() {
devolver fragmento;
}
public String getTitle() {
devolver título;
}
}
Es necesario agregar la función de reversión.
/**
* Presione la pila para retroceder al retroceder
*/
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() != 1) {
getSupportFragmentManager().popBackStackImmediate();
} else {
super.onBackPressed();
}
}
Utilice el método popBackStackImmediate para hacer estallar la pila cuando vaya atrás, preste atención aquí PopBackStack no se puede utilizar; de lo contrario, getBackStackEntryCount puede devolver un valor incorrecto.
A continuación, debe configurar el Fragmento predeterminado de la página, que es el primer Fragmento, y llamarlo en onCreate:
FragmentModule defaultModule = getDefaultModule()
;setTitle (defaultModule.getTitle());
getSupportFragmentManager().beginTransaction().add(getContentId(), defaultModule.getFragment(),
etiqueta).addToBackStack (null). commit();
getDefaultModule es un método abstracto utilizado para devolver el Fragmento predeterminado.
Lo anterior está básicamente completo.
Cuando se usa, Activity hereda BaseFragmentActivity y luego implementa los métodos getDefaultMoudle(), getContentId y getFragmentModule
getContentId devuelve el ID del diseño y el Fragmento se mostrará en el diseño
getFragmentModule devuelve un HashMap, la clave es la etiqueta del fragmento y el valor es FragmentModule.
GetDefaultMoudle puede crear directamente un nuevo FragmentModule.
Finalmente, Fragment necesita proporcionar un constructor que inyecte IFragmentCallback. Luego llame a callback.jump(tag, this) en el Fragmento para saltar y a callback.home() para regresar a la primera página.
Si necesita cambiar el título al revertir, debe anular el método onHiddenChanged (booleano oculto) del Fragmento.