Чӣ гуна ба навигатсия бо тугмаҳо амал мекунед, то ки стекиро нигоҳ дорад?
sobes.tech AI
Ҷавоб аз AI
Ман истифода мебарам Navigation Architecture Component.
-
Сохтани 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> -
Ҷойгиркунии 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> -
Илова кардани тугмаҳои навигатсия: Ман
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> -
Ҳал кардани тугмаҳо дар коди: Ман
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 кор кард.