Navigation Component — βιβλιοθήκη Android Jetpack για την υλοποίηση πλοήγησης μεταξύ οθονών της εφαρμογής. Το στοιχείο συγκεντρώνει τη διαχείριση της στοίβας τμημάτων, των βαθιών συνδέσμων και της μεταφοράς ορισμάτων. Αποτελεί μέρος του Jetpack από το 2018 και προτείνεται από την Google για όλα τα νέα έργα. Διαβάστε περισσότερα στον επίσημο οδηγό της Google.
Κύρια σημεία
Navigation Component — βιβλιοθήκη Android Jetpack (androidx.navigation) που παρέχει ενιαίο API για πλοήγηση. Περιλαμβάνει τρία βασικά στοιχεία: Navigation Graph (γράφος πλοήγησης), NavHostFragment (δοχείο για οθόνες) και NavController (ελεγκτής μεταβάσεων). Το στοιχείο διαχειρίζεται αυτόματα τη στοίβα επιστροφής και υποστηρίζει deep links.
Πριν από το Navigation Component, οι προγραμματιστές διαχειρίζονταν τα τμήματα χειροκίνητα μέσω FragmentManager. Αυτό οδηγούσε σε κατακερματισμένο κώδικα: κάθε οθόνη είχε τους δικούς της κανόνες πλοήγησης, οι καταστάσεις της στοίβας επιστροφής διέφεραν και τα deep links απαιτούσαν ξεχωριστή υλοποίηση. Το Navigation Component ενοποίησε αυτά τα σενάρια. Σύμφωνα με την Google (2026), η βιβλιοθήκη είναι εγκατεστημένη στο 90% των νέων έργων Android.
Navigation Component ενσωματώνεται με άλλες βιβλιοθήκες Jetpack: LiveData, ViewModel, Material Design. Υποστηρίζει τόσο τμήματα XML όσο και Jetpack Compose μέσω της επέκτασης navigation-compose. Σταθερή έκδοση — 2.8.x (2025), ελάχιστη έκδοση Android — API 14.
NavGraph — πόρος XML (res/navigation/nav_graph.xml) που ορίζει όλες τις οθόνες της εφαρμογής και τις συνδέσεις μεταξύ τους. Κάθε οθόνη είναι ένας κόμβος (destination) που μπορεί να είναι Fragment, Activity ή Composable. Οι συνδέσεις μεταξύ κόμβων είναι action, που καθορίζουν την κατεύθυνση της μετάβασης.
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@+id/homeFragment">
<fragment
android:id="@+id/homeFragment"
android:name=".HomeFragment"
android:label="Αρχική"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_detail"
app:destination="@+id/detailFragment"
app:enterAnim="@anim/slide_in_right"
app:exitAnim="@anim/slide_out_left"
app:popEnterAnim="@anim/slide_in_left"
app:popExitAnim="@anim/slide_out_right" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Λεπτομέρειες"
tools:layout="@layout/fragment_detail">
<argument android:name="itemId"
app:argType="integer"
android:defaultValue="0" />
</fragment>
</navigation>Το χαρακτηριστικό startDestination ορίζει την πρώτη οθόνη που εμφανίζεται κατά την εκκίνηση. Το action καθορίζει τον προορισμό (destination) και προαιρετικά κινούμενα σχέδια. Τα ορίσματα (argument) περιγράφουν τις παραμέτρους που μεταφέρονται στην οθόνη — τύπο και προεπιλεγμένη τιμή.
NavHostFragment — δοχείο που τοποθετείται στη διάταξη Activity και εμφανίζει την τρέχουσα οθόνη πλοήγησης. Το NavHostFragment αλλάζει αυτόματα τμήματα όταν καλείται το NavController.navigate(). NavController — αντικείμενο που διαχειρίζεται την πλοήγηση: μετάβαση, επιστροφή, έλεγχος τρέχουσας διαδρομής.
// Layout Activity: activity_main.xml
// <androidx.fragment.app.FragmentContainerView
// android:id="@+id/nav_host_fragment"
// android:name="androidx.navigation.fragment.NavHostFragment"
// app:navGraph="@navigation/nav_graph"
// app:defaultNavHost="true" />
class MainActivity : AppCompatActivity() {
private val navController by lazy {
(findViewById<NavHostFragment>(R.id.nav_host_fragment))
.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Το NavigationUI συνδέει το NavController με το AppBar
setupActionBarWithNavController(navController)
}
// Μετάβαση στην οθόνη λεπτομερειών
fun openDetail(itemId: Long) {
val bundle = Bundle().apply {
putLong("itemId", itemId)
}
navController.navigate(R.id.action_home_to_detail, bundle)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}app:defaultNavHost="true" — σημαντικό χαρακτηριστικό: αναχαιτίζει το κουμπί συστήματος 'Πίσω' και μεταβιβάζει τον έλεγχο στο NavController. NavigationUI — βοηθητικό πρόγραμμα για σύνδεση του NavController με AppBar, BottomNavigationView, NavigationDrawer. Το setupActionBarWithNavController ενεργοποιεί το βέλος 'Πάνω' σε ένθετες οθόνες.
Navigation Component υποστηρίζει προσαρμοσμένα κινούμενα σχέδια μετάβασης, που ορίζονται στο action ή προγραμματιστικά. Τα κινούμενα σχέδια ορίζονται από τέσσερα χαρακτηριστικά: enterAnim (εμφάνιση νέας οθόνης), exitAnim (εξαφάνιση τρέχουσας), popEnterAnim (εμφάνιση κατά επιστροφή) και popExitAnim (εξαφάνιση κατά επιστροφή).
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%"
android:toXDelta="0%"
android:duration="300" />
</set>
// Προγραμματιστική μετάβαση με κινούμενο σχέδιο
val navOptions = NavOptions.Builder()
.setEnterAnim(R.anim.slide_in_right)
.setExitAnim(R.anim.slide_out_left)
.setPopEnterAnim(R.anim.slide_in_left)
.setPopExitAnim(R.anim.slide_out_right)
.build()
navController.navigate(R.id.detailFragment, args, navOptions)Τα κινούμενα σχέδια λειτουργούν με Fragment σε επίπεδο FragmentTransaction. Για Jetpack Compose, τα κινούμενα σχέδια ορίζονται μέσω NavOptionsCompat χρησιμοποιώντας Compose Animation. Το Navigation Component δεν επιβάλλει περιορισμούς στον τύπο κινούμενου σχεδίου — υποστηρίζει translate, scale, alpha και τους συνδυασμούς τους.
Safe Args — πρόσθετο Gradle για ασφαλή μεταφορά δεδομένων μεταξύ οθονών. Το πρόσθετο αναλύει το NavGraph, δημιουργεί κλάσεις Directions και Args με συγκεκριμένους τύπους πεδίων. Στο στάδιο μεταγλώττισης ελέγχεται η αντιστοιχία τύπων — το σφάλμα MissingArgumentException ανιχνεύεται πριν από την εκτέλεση της εφαρμογής.
// build.gradle (module)
plugins {
id 'androidx.navigation.safeargs.kotlin'
}
// Το Safe Args δημιουργεί: DetailFragmentArgs, HomeFragmentDirections
// Χρήση στο HomeFragment:
val action = HomeFragmentDirections
.actionHomeToDetail(itemId = 42L)
findNavController().navigate(action)
// Χρήση στο DetailFragment:
private val args: DetailFragmentArgs by navArgs()
// Το args.itemId έχει τύπο Long, το null δεν μπορεί να μεταφερθεί
override fun onViewCreated(...) {
super.onViewCreated(...)
loadItem(args.itemId)
}navArgs() — εκπρόσωπος Kotlin για λήψη ορισμάτων σε Fragment ή Activity. Το πρόσθετο υποστηρίζει πρωτότυπους τύπους, συμβολοσειρές, Parcelable, Serializable, Enum και πίνακες. Για σύνθετα αντικείμενα, χρησιμοποιήστε μεταφορά ID με φόρτωση από ViewModel ή βάση δεδομένων.
Deep Link — εξωτερικός σύνδεσμος που ανοίγει μια συγκεκριμένη οθόνη της εφαρμογής. Το Navigation Component χειρίζεται deep links μέσω του χαρακτηριστικού app:deepLink στο NavGraph. Το σύστημα δημιουργεί ένα PendingIntent που αποκαθιστά τη στοίβα πλοήγησης έως την οθόνη προορισμού ή δημιουργεί νέα στοίβα εάν η εφαρμογή δεν εκτελείται.
<fragment android:id="@+id/profileFragment"
android:name=".ProfileFragment">
<deepLink
app:uri="https://example.com/profile/{userId}" />
<argument
android:name="userId"
app:argType="string" />
</fragment>
// Προγραμματιστική δημιουργία Deep Link
val pendingIntent = NavDeepLinkBuilder(context)
.setGraph(R.navigation.nav_graph)
.setDestination(R.id.profileFragment)
.setArguments(Bundle().apply {
putString("userId", "user_123")
})
.createPendingIntent()Τα Deep Links υποστηρίζουν πρότυπα URI με διαδρομές και παραμέτρους query, intent action και mime type. Το placeholder ({userId}) αντιστοιχίζεται αυτόματα στο όρισμα destination. Το Navigation Component χειρίζεται επίσης implicit deep links μέσω AndroidManifest — αρκεί να προσθέσετε intent-filter στο Activity με NavHostFragment.
Navigation Compose (androidx.navigation:navigation-compose) — επέκταση του Navigation Component για Jetpack Compose. Το API διατηρεί την έννοια του NavController και NavHost, αλλά οι οθόνες είναι συναρτήσεις Composable αντί για Fragment. Το NavHost δέχεται ένα composable lambda για κάθε διαδρομή.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "home"
) {
composable("home") {
HomeScreen(
onItemClick = { id ->
navController.navigate("detail/$id")
}
)
}
composable(
route = "detail/{itemId}",
arguments = listOf(
navArgument("itemId") {
type = NavType.LongType
}
)
) { backStackEntry ->
val itemId = backStackEntry
.arguments?.getLong("itemId") ?: 0L
DetailScreen(itemId = itemId)
}
}
}
}
}
}Το Navigation Compose χρησιμοποιεί διαδρομές συμβολοσειράς αντί για id. Οι παράμετροι μεταφέρονται μέσω του προτύπου διαδρομής ("detail/{itemId}") και εξάγονται από το backStackEntry. Το rememberNavController() διατηρεί το NavController κατά την ανασύνθεση. Για Type Safety στο Compose, συνιστάται η ενότητα navigation-compose-type-safety (πειραματική).
Συχνές Ερωτήσεις
NavHost — δοχείο για εμφάνιση οθονών πλοήγησης. Υλοποιείται μέσω NavHostFragment σε διάταξη XML. Το NavHost παρακολουθεί την τρέχουσα οθόνη στο NavGraph και διαχειρίζεται μεταβάσεις. Κάθε Activity περιέχει ένα NavHostFragment.
Safe Args — πρόσθετο Gradle που δημιουργεί ασφαλείς κλάσεις ορισμάτων. Το Bundle απαιτεί χειροκίνητη指定ση κλειδιών και τύπων, οδηγώντας σε σφάλματα χρόνου εκτέλεσης. Το Safe Args ελέγχει τους τύπους κατά τη μεταγλώττιση και σειριοποιεί αυτόματα τα δεδομένα.
Τα σύνθετα αντικείμενα μεταφέρονται μέσω ViewModel (κοινόχρηστο μεταξύ οθονών) ή μέσω βάσης δεδομένων με μεταφορά ID. Το Safe Args υποστηρίζει μόνο πρωτότυπους τύπους, συμβολοσειρές και Parcelable. Η Google συνιστά να αποφεύγετε τη μεταφορά μεγάλων αντικειμένων μέσω ορισμάτων πλοήγησης.
Deep Link ρυθμίζεται στο NavGraph μέσω του χαρακτηριστικού app:deepLink. Το Navigation Component χειρίζεται αυτόματα εισερχόμενους συνδέσμους, δημιουργεί PendingIntent μέσω NavDeepLinkBuilder και αποκαθιστά τη στοίβα πλοήγησης έως την οθόνη προορισμού. Υποστηρίζει URI, intent action και mime type.
Ναι. Το Navigation Compose (androidx.navigation:navigation-compose) παρέχει NavHost για Compose. Το API είναι παρόμοιο με την έκδοση XML, αλλά οι οθόνες είναι συναρτήσεις Composable. Το NavController χρησιμοποιείται ίδια και στις δύο εκδόσεις. Η Google συνιστά το Navigation Compose για νέα έργα σε Compose.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης