Sobes.tech
Middle

Come implementeresti la navigazione usando i pulsanti affinché mantenga lo stack?

sobes.tech AI

Risposta dell'AI

Utilizzerei il componente Navigation Architecture.

  1. 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>
    
  2. 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>
    
  3. Aggiungere pulsanti di navigazione: Utilizzerei BottomNavigationView o pulsanti separati. Per BottomNavigationView, lo collegherei a NavController.

    <?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>
    
  4. Gestire i clic sui pulsanti nel codice: Otterrei il NavController e chiamerei navigate() al clic del pulsante. NavController gestisce 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.