- Adaptar el código de un proyecto Android para el envío de argumentos de manera segura mediante SafeArgs.
- Implementar una navegación en un proyecto Android a partir de menús y paneles.
En este ejemplo enviaremos argumentos de manera segura, con la forma de navegar por acciones, y se aplicarán métodos de navegación reconocidos por los usuarios de Android. Para hacerlo es necesario realizar los siguientes pasos:
-
Nos dirigimos al mobile_navigation.xml. Ahí corroboramos que se envía el argumento dentro del flow_step_one_dest.
<argument android:name="flowStepNumber" app:argType="integer" android:defaultValue="1"/>
-
Ahora se debe abrir el FlowStepFragment y reemplazar la línea “val flowStepNumber = arguments?.getInt("flowStepNumber")” por el siguiente código.
val safeArgs: FlowStepFragmentArgs by navArgs() val flowStepNumber = safeArgs.flowStepNumber
-
Después se abre HomeFragment y se cambia el evento del navigate_action_button con el siguiente código que utiliza los safeArgs.
val flowStepNumberArg = 1 val action = HomeFragmentDirections.nextAction(flowStepNumberArg) findNavController().navigate(action)
-
Posteriormente ejecutamos el proyecto y hacemos clic en Navigate with action. Se distinguirá que tiene el mismo funcionamiento, pero ahora se hace con safeArgs.
-
Se proseguirá con el menú y los paneles. Para ello creamos el recurso de menú overflow_menu y le agregamos el siguiente código.
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/settings_dest" android:icon="@drawable/ic_settings" android:menuCategory="secondary" android:title="@string/settings" /> </menu>
-
Luego se abre MainActivity y se agregan las siguiente líneas de código.
El onCreateOptionsMenu agrega la interfaz y el onOptionsItemSelected se mantendrá esperando que el usuario haga clic en la opción. Con esto NavigationUI controla las opciones de este menú.
override fun onCreateOptionsMenu(menu: Menu): Boolean { val retValue = super.onCreateOptionsMenu(menu) val navigationView = findViewById<NavigationView>(R.id.nav_view) if (navigationView == null) { menuInflater.inflate(R.menu.overflow_menu, menu) return true } return retValue } override fun onOptionsItemSelected(item: MenuItem): Boolean { return item.onNavDestinationSelected(findNavController(R.id.my_nav_host_fragment)) || super.onOptionsItemSelected(item) }
-
Se debe compilar la app y ahora tendrá los tres puntos del menú. Al hacer clic sobre ellos, estos abren un menú con el texto Settings, y cuando se hace clic en Settings se dirige a la pantalla siguiente.
-
Para completar el reto resta agregar el panel. Para empezar abrimos el MainActivity y agregamos las siguientes líneas, las cuales activan la navegación inferior y el panel lateral.
private fun setupBottomNavMenu(navController: NavController) { val bottomNav = findViewById<BottomNavigationView>(R.id.bottom_nav_view) bottomNav?.setupWithNavController(navController) } private fun setupNavigationMenu(navController: NavController) { val sideNavView = findViewById<NavigationView>(R.id.nav_view) sideNavView?.setupWithNavController(navController) } private fun setupActionBar(navController: NavController, appBarConfig : AppBarConfiguration) { setupActionBarWithNavController(navController, appBarConfig) } override fun onSupportNavigateUp(): Boolean { return findNavController(R.id.my_nav_host_fragment).navigateUp(appBarConfiguration) }
-
Luego es necesario configurar la ActionBar, para que muestre el icono de menú, mediante la adición del siguiente código dentro del onCreate del MainActivity.
val drawerLayout : DrawerLayout? = findViewById(R.id.drawer_layout) appBarConfiguration = AppBarConfiguration( setOf(R.id.home_dest, R.id.deeplink_dest), drawerLayout) setupActionBar(navController, appBarConfiguration) setupNavigationMenu(navController) setupBottomNavMenu(navController)
Nota: los destinos listados en el AppBarConfiguration no agregan la flecha Atrás al ser seleccionados, ya que son de orden superior. Por ejemplo: al entrar a Settings veremos la fecha de Back.
¡Felicidades! Ahora tu app envía argumentos con SafeArgs y tiene navegación desde un menú, un panel inferior y uno lateral. El siguiente reto te espera con el logro de implementar una nueva opción de menú. ¡Adelante!
Siguiente (Postwork)