Sobes.tech
Middle

Чӣ гуна ба навигатсия бо тугмаҳо амал мекунед, то ки стекиро нигоҳ дорад?

sobes.tech AI

Ҷавоб аз AI

Ман истифода мебарам Navigation Architecture Component.

  1. Сохтани NavGraph: Destinations (фрагментҳо ё Activity) ва Actions (гузаришҳо байни онҳо) дар манбаи 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"> // нуқтаи оғоз
    
        <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. Ҷойгиркунии NavHost: Ман NavHost (масалан, NavHostFragment) дар тарҳрезии Activity илова мекунам, ки ба он 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" /> // пайваст кардани NavGraph
    
        <!-- Ин ҷо метавонанд тугмаҳои навигатсия бошанд -->
    </LinearLayout>
    
  3. Илова кардани тугмаҳои навигатсия: Ман BottomNavigationView ё тугмаҳои алоҳида истифода мебарам. Ба BottomNavigationView пайваст мекунам бо 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="Берав ба B" />
    
        <Button
            android:id="@+id/button_go_to_c"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Берав ба C" />
    </LinearLayout>
    
  4. Ҳал кардани тугмаҳо дар коди: Ман NavController-ро мегирам ва navigate()-ро дар вақти клик истифода мебарам. NavController автоматӣ back stack-ро идора мекунад.

    // Дар Activity ё Fragment
    import androidx.navigation.findNavController
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        val navController = findNavController(R.id.nav_host_fragment) // гирифтани NavController
    
        view.findViewById<Button>(R.id.button_go_to_b).setOnClickListener {
            navController.navigate(R.id.action_fragmentA_to_fragmentB) // гузариш тавассути Action
        }
    
        view.findViewById<Button>(R.id.button_go_to_c).setOnClickListener {
            // гузариши мустақим ба Destination, мумкин аст истифодаи action_fragmentA_to_fragmentC агар вуҷуд дошта бошад
             navController.navigate(R.id.fragmentC)
        }
    }
    

Барои навигатсияи мураккаб бо чанд таб (BottomNavigationView, DrawerLayout) ман setupWithNavController()-ро истифода мебарам.

// Дар Activity бо 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) // пайваст кардани BottomNavigationView бо NavController
}

Компоненти Navigation ба таври худкор back stack-ро идора мекунад. Ҳангоми пахш кардани тугмаи "Қайту" корбарро ба destination-и қаблӣ дар back stack бармегардонад. Барои идора кардани рафтори back stack дар вақти navigate() метавон бо истифода аз NavOptions бо popUpTo кор кард.