Come implementeresti la navigazione usando i pulsanti affinché mantenga lo stack?
sobes.tech AI
Risposta dell'AI
Utilizzerei il componente Navigation Architecture.
-
Creare il NavGraph: Definirei Destinazioni (fragmenti o Activity) e Azioni (transizioni tra loro) in una risorsa XML.
<?xml version="1.0" encoding="utf-8"?> <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/nav_graph" app:startDestination="@id/fragmentA"> // Punto di partenza <fragment android:id="@+id/fragmentA" android:name="com.example.FragmentA" android:label="FragmentA" > <action android:id="@+id/action_fragmentA_to_fragmentB" app:destination="@id/fragmentB" /> </fragment> <fragment android:id="@+id/fragmentB" android:name="com.example.FragmentB" android:label="FragmentB" > <action android:id="@+id/action_fragmentB_to_fragmentC" app:destination="@id/fragmentC" /> </fragment> <fragment android:id="@+id/fragmentC" android:name="com.example.FragmentC" android:label="FragmentC" /> </navigation> -
Posizionare il NavHost: Aggiungerei un
NavHost(ad esempio,NavHostFragment) nel layout dell'Activity, a cui associare il NavGraph.<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" /> // Collegamento al NavGraph <!-- Qui possono esserci pulsanti di navigazione --> </LinearLayout> -
Aggiungere pulsanti di navigazione: Utilizzerei
BottomNavigationViewo pulsanti separati. PerBottomNavigationView, lo collegherei aNavController.<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" /> <Button android:id="@+id/button_go_to_b" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Vai a B" /> <Button android:id="@+id/button_go_to_c" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Vai a C" /> </LinearLayout> -
Gestire i clic sui pulsanti nel codice: Otterrei il
NavControllere chiamereinavigate()al clic del pulsante.NavControllergestisce automaticamente lo back stack, conservando le destinazioni precedenti.// In Activity o Fragment import androidx.navigation.findNavController override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val navController = findNavController(R.id.nav_host_fragment) // Ottenere NavController view.findViewById<Button>(R.id.button_go_to_b).setOnClickListener { navController.navigate(R.id.action_fragmentA_to_fragmentB) // Navigazione tramite Action } view.findViewById<Button>(R.id.button_go_to_c).setOnClickListener { // Esempio di navigazione diretta a Destination, si può usare action_fragmentA_to_fragmentC se esiste navController.navigate(R.id.fragmentC) } }
Per navigazioni più complesse con più schede (BottomNavigationView, DrawerLayout), userei setupWithNavController().
// In Activity con BottomNavigationView
import androidx.navigation.ui.setupWithNavController
import com.google.android.material.bottomnavigation.BottomNavigationView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navController = findNavController(R.id.nav_host_fragment)
val bottomNavView = findViewById<BottomNavigationView>(R.id.bottom_nav_view)
bottomNavView.setupWithNavController(navController) // Collegamento di BottomNavigationView con NavController
}
Il componente Navigation gestisce di default lo back stack. Premendo il pulsante "Indietro" l'utente torna al precedente Destination nel back stack. Per controllare il comportamento del back stack durante navigate(), si può usare NavOptions con popUpTo.