Estoy usando el nuevo componente de arquitectura de navegación en Android y estoy atascado en borrar la pila de navegación después de moverme a un nuevo fragmento.
Ejemplo: estoy en el loginFragment y quiero que este fragmento se borre de la pila cuando navegue al fragmento de inicio para que el usuario no vuelva al loginFragment cuando presione el botón Atrás.
Estoy usando un NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) simple para navegar.
Código actual:
mAuth.signInWithCredential(credential)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
} else {
Log.w(TAG, "signInWithCredential:failure", task.getException());
}
}
});
Intenté usar NavOptions en navigate () , pero el botón de retroceso todavía me envía de regreso al loginFragment
NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);
popBackStack
o no añadirLoginFragment
a backstack proporcionarnull
aaddToBackStack(null);
y sustituirla por nuevaFragment
navigate()
método comonavigate(int resId, Bundle args, NavOptions navOptions)
y proporcionar elNavOptions
que mejor se adapte a su senarioRespuestas:
Primero, agregue atributos
app:popUpTo='your_nav_graph_id'
yapp:popUpToInclusive="true"
a la etiqueta de acción.En segundo lugar, navegue hasta el destino, utilizando la acción anterior como parámetro.
Consulte los documentos para obtener más información.
NOTA : Si navega usando el método
navigate(@IdRes int resId)
, no obtendrá el resultado deseado. Por lo tanto, utilicé el métodonavigate(@NonNull NavDirections directions)
.fuente
findNavController(fragment).navigate(R.id.action_signInFragment_to_usersFragment)
En mi caso, necesitaba eliminar todo en la pila posterior antes de abrir un nuevo fragmento, así que usé este código
la primera línea elimina la pila trasera hasta que alcanza el fragmento especificado en mi caso, es el fragmento de inicio, por lo que elimina toda la pila trasera por completo, y cuando el usuario vuelve a hacer clic en fragment_company, cierra la aplicación.
fuente
fragment_apps
??Creo que su pregunta se refiere específicamente a cómo usar la aplicación Pop Behavior / Pop To /: popUpTo (en xml)
En la documentación,
emerge a un destino determinado antes de navegar. Esto saca todos los destinos que no coinciden de la pila de actividades hasta que se encuentra este destino.
Ejemplo (aplicación de búsqueda de empleo simple)
mi gráfico start_screen_nav es así:
si quiero navegar
EmployerMainFragment
y hacer estallar todo incluido,startScreenFragment
entonces el código será:si quiero navegar
EmployerMainFragment
y hacer pop todo excluyendo,startScreenFragment
entonces el código será:si quiero navegar
EmployerMainFragment
y aparecerloginFragment
pero no,startScreenFragment
entonces el código será:O
fuente
NOTA: La tarea clara está obsoleta, la descripción oficial es
Respuesta antigua
Si no quiero ir a través de todo lo que la pelusa en el código, simplemente puede comprobar
Clear Task
enLaunch Options
las propiedades de la acción.Editar: A partir de Android Studio 3.2 Beta 5, Borrar tarea ya no está visible en la ventana Opciones de lanzamiento, pero aún puede usarlo en el código XML de navegación, en la etiqueta de acción , agregando
fuente
Finalmente lo descubrí gracias a ¿Cómo deshabilitar ARRIBA en Navegación para algún fragmento con el nuevo Componente de Arquitectura de Navegación?
Tuve que especificar .setClearTask (true) como NavOption.
fuente
navigate(int resId, Bundle args, NavOptions navOptions)
yNavOptions
val navOptions = NavOptions.Builder().setPopUpTo(R.id.my_current_frag, true).build()
findNavController().navigate(R.id.my_next_frag, null, navOptions)
R.id.my_next_frag
podría ser como una pantalla de inicio de sesión o de presentación); También si quieres popBack sólo uno, puede utilizar:NavHostFragment.findNavController(this).popBackStack()
.Así es como lo estoy haciendo.
fuente
false
?inclusive boolean: true to also pop the given destination from the back stack
, configuré el inclusivo en falso porque no quiero sacar el fragmento actual de la pila.fuente
Puede anular la presión hacia atrás de la actividad base de esta manera:
fuente
Nota: Es posible que esto no se relacione con la pregunta real.
Este enfoque será útil si se necesita una sola instancia de un fragmento para mantener en Navigation .
Aquí,
navOptions
es DSL y necesita ser importado. En el momento de esta respuesta, estoy usando las siguientes versiones de Gradle de la interfaz de usuario de navegación .fuente
Luché por un tiempo para evitar que el botón de retroceso volviera a mi fragmento de inicio, que en mi caso era un mensaje de introducción que solo debería aparecer una vez.
La solución fácil fue crear una acción global que apuntara al destino en el que el usuario debería permanecer. Tiene que configurarlo
app:popUpTo="..."
correctamente: configúrelo en el destino que desea que aparezca. En mi caso fue mi mensaje de introducción. También estableceapp:popUpToInclusive="true"
fuente
Puedo explicar esto con un pequeño ejemplo. Tengo dos fragmentos de la lista de empleados y elimino empleado. En eliminar empleado, tengo dos eventos de clic cancelar y eliminar. Si hago clic en cancelar, simplemente vuelvo a la pantalla de la lista de empleados y si hago clic en eliminar, quiero borrar todas las pilas anteriores e ir a la pantalla de la lista de empleados.
Para ir a la pantalla anterior:
Para borrar todo el backstack anterior e ir a una nueva pantalla:
Para obtener más referencia: Ejemplo de navegación Jetpack
fuente
Puedes hacerlo tan simple como:
Si desea verificar el recuento, puede hacer lo siguiente:
fuente