Fragment: τι είναι, τμήματα και FragmentManager στο Android

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-22 Χρόνος ανάγνωσης: 7 λεπ

Fragment — επαναχρησιμοποιήσιμο στοιχείο UI στο Android, που ενσωματώνεται σε Activity και διαχειρίζεται μέσω FragmentManager. Κάθε τμήμα έχει τον δικό του κύκλο ζωής, layout και κατάσταση. Το Fragment διευκολύνει την προσαρμογή σε διαφορετικά μεγέθη οθόνης και την επαναχρησιμοποίηση κώδικα. Διαβάστε περισσότερα στον επίσημο οδηγό Google.

Κύρια σημεία

  • Fragment — στοιχείο UI εντός Activity με δικό του κύκλο ζωής και layout
  • FragmentManager — κλάση για διαχείριση συναλλαγών τμημάτων και στοίβας επιστροφής
  • FragmentTransaction — ατομική λειτουργία προσθήκης, αντικατάστασης ή αφαίρεσης τμημάτων
  • Jetpack Fragment — βιβλιοθήκη για συμβατότητα προς τα πίσω έως Android 1.6 (API 4)
  • ViewModel — κοινό στοιχείο για ανταλλαγή δεδομένων μεταξύ τμημάτων στο ίδιο Activity

Τι είναι το Fragment;

Fragment — αρθρωτό στοιχείο διεπαφής χρήστη Android που αντιπροσωπεύει ένα μέρος της οθόνης εντός Activity. Το Fragment μπορεί να διαχειρίζεται το δικό του layout, να επεξεργάζεται γεγονότα κύκλου ζωής και να αποθηκεύει την κατάστασή του. Χάρη στην αρθρωτότητα, ένα τμήμα μπορεί να χρησιμοποιηθεί σε διαφορετικά Activity και σε διαφορετικές συσκευές.

Το Fragment API εμφανίστηκε στο Android 3.0 (Honeycomb, API 11) το 2011 για υποστήριξη tablet. Πριν από αυτό, οι προγραμματιστές έπρεπε να δημιουργούν ξεχωριστά Activity για τηλέφωνο και tablet. Το Fragment επέτρεψε τη σύνθεση της οθόνης από ανεξάρτητα μπλοκ. Το 2019, η Google κυκλοφόρησε τη βιβλιοθήκη Jetpack Fragment με συμβατότητα προς τα πίσω έως API 4.

Σύμφωνα με στοιχεία της Google (2026), 80% των εφαρμογών στο Google Play χρησιμοποιούν Fragment σε κάποια μορφή. Η βιβλιοθήκη Jetpack Fragment έχει ληφθεί πάνω από 10 δισεκατομμύρια φορές μέσω Google Play Services. Το Fragment παραμένει βασικό στοιχείο της αρχιτεκτονικής Android ακόμη και στην εποχή του Jetpack Compose.

Κύκλος ζωής Fragment

Ο κύκλος ζωής του Fragment είναι πιο περίπλοκος από αυτόν του Activity, καθώς εξαρτάται από την κατάσταση του Activity-οικοδεσπότη. Το Fragment περνά από τις ίδιες καταστάσεις με το Activity, αλλά προσθέτει δικά του callback: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.

Callback FragmentΑντιστοιχία ActivityΣκοπός
onAttachπριν από onCreateFragment συνδέθηκε με Activity
onCreateonCreateΑρχικοποίηση δεδομένων μη σχετικών με UI
onCreateViewonCreateΔημιουργία layout μέσω inflater
onViewCreatedonCreateΣύνδεση στοιχείων UI μετά τη δημιουργία view
onDestroyViewonDestroyΑφαίρεση view, απελευθέρωση πόρων UI
onDetachonDestroyFragment αποσυνδέθηκε από Activity

Σύγκριση κύκλου ζωής Fragment και Activity

Η κύρια διαφορά του κύκλου ζωής Fragment — η κλήση onCreateView και onDestroyView μεταξύ onCreate και onDestroy. Το Fragment μπορεί να υπάρχει χωρίς UI (αν το onCreateView επιστρέφει null). Μετά την αναδημιουργία του Activity, το FragmentManager αποκαθιστά αυτόματα τα τμήματα.

FragmentManager και συναλλαγές

FragmentManager — κεντρική κλάση για διαχείριση τμημάτων σε Activity. Είναι υπεύθυνη για την προσθήκη, αφαίρεση, αντικατάσταση τμημάτων, διαχείριση στοίβας επιστροφής και αποκατάσταση κατάστασης. Το FragmentManager είναι προσβάσιμο μέσω supportFragmentManager (AndroidX) ή fragmentManager (παλιό API).

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Αν το τμήμα δεν έχει προστεθεί ακόμα — το δημιουργούμε
        if (savedInstanceState == null) {
            val transaction = this.supportFragmentManager
                .beginTransaction()
            transaction.add(R.id.fragment_container, ListFragment())
            transaction.addToBackStack(null)
            transaction.commit()
        }
    }

    fun replaceFragment(fragment: Fragment) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragment_container, fragment)
            .addToBackStack(null)
            .commit()
    }
}

Οι συναλλαγές FragmentTransaction — είναι ατομικές. Η commit() προγραμματίζει εκτέλεση για τον επόμενο κύκλο Looper. Για άμεση εκτέλεση χρησιμοποιήστε commitNow(). Η addToBackStack(null) προσθέτει τη συναλλαγή στη στοίβα επιστροφής — το κουμπί «Πίσω» θα ακυρώσει τη λειτουργία.

Μέθοδοι κύκλου ζωής Fragment

Ας εξετάσουμε τις βασικές μεθόδους του κύκλου ζωής Fragment με παράδειγμα σε Kotlin. Η onCreateView δημιουργεί layout — σε αντίθεση με το Activity, η μέθοδος πρέπει να επιστρέψει View. Η onViewCreated καλείται αμέσως μετά, εδώ είναι ασφαλής η εύρεση στοιχείων κατά id. Η onDestroyView — η τελευταία στιγμή για καθαρισμό αναφορών στο view.

kotlin
class DetailFragment : Fragment() {

    private var _binding: FragmentDetailBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentDetailBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.textTitle.setText("Λεπτομέρειες")
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}

Το μοτίβο View Binding με _binding/binding εγγυάται ότι μετά το onDestroyView η αναφορά στο layout μηδενίζεται. Η πρόσβαση στο binding μετά την καταστροφή του view θα προκαλέσει NullPointerException. Αυτό το μοτίβο προτείνεται από την Google για όλα τα τμήματα.

Μεταφορά δεδομένων μεταξύ τμημάτων

Για μεταφορά δεδομένων μεταξύ τμημάτων, το Android προσφέρει διάφορους μηχανισμούς. Ο πιο αξιόπιστος — κοινό ViewModel, που μοιράζεται μεταξύ τμημάτων του ίδιου Activity. Το Fragment Result API είναι κατάλληλο για εφάπαξ γεγονότα. Τα ορίσματα Bundle — για δεδομένα κατά τη δημιουργία τμήματος.

kotlin
// Κοινό ViewModel για δύο τμήματα
class SharedViewModel : ViewModel() {
    private val _selectedItem = MutableLiveData<Item>()
    val selectedItem: LiveData<Item> = _selectedItem

    fun select(item: Item) { _selectedItem.setValue(item) }
}

// Τμήμα A: στέλνει γεγονός μέσω Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))

// Τμήμα B: λαμβάνει το γεγονός
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
    val value = bundle.getString("key")
}

Το Fragment Result API (προστέθηκε στο Fragment 1.3.0) αντικαθιστά τα παρωχημένα setTargetFragment/onActivityResult. Το API είναι type-safe, χρησιμοποιεί Bundle και δεν απαιτεί γνώση του παραλήπτη. Το Parent FragmentManager λειτουργεί ως μεσάζων μεταξύ τμημάτων.

Fragment vs Activity: πότε να επιλέξετε τι

Η επιλογή μεταξύ Fragment και Activity εξαρτάται από την αρχιτεκτονική της εφαρμογής. Το Fragment είναι υποχρεωτικό για προσαρμοστικά layouts (τηλέφωνο + tablet), για προσαρμοσμένη κινούμενη εικόνα μεταβάσεων και για χρήση Jetpack Navigation. Το Activity προτιμάται για απλές εφαρμογές με μία-δύο οθόνες.

ΚριτήριοFragmentActivity
Ταχύτητα δημιουργίαςΓρηγορότερο (ελαφρύ στοιχείο)Αργότερο (διεργασία συστήματος)
ΕπαναχρησιμοποίησηΥψηλή (ένα τμήμα σε διαφορετικά Activity)Χαμηλή (κάθε οθόνη — δικό της Activity)
Κινούμενη εικόνα μεταβάσεωνΕυέλικτη (FragmentTransaction)Περιορισμένη (overridePendingTransition)
Αποθήκευση κατά περιστροφήΑυτόματη (διαχειριστής αποκαθιστά)Χειροκίνητη (onSaveInstanceState)
Deep LinksΜέσω Navigation ComponentΕγγενής υποστήριξη μέσω intent-filter

Jetpack Fragment και Jetpack Navigation

Η σύγχρονη προσέγγιση εργασίας με Fragment — το Jetpack Navigation Component, που αντικαθιστά τη χειροκίνητη διαχείριση FragmentManager. Η βιβλιοθήκη παρέχει NavGraph (XML γράφημα πλοήγησης), NavHostFragment και Safe Args για type-safe μεταφορά δεδομένων.

Βιβλιοθήκη Jetpack Fragment (androidx.fragment:fragment-ktx) περιλαμβάνει FragmentResult API, DialogFragment, BottomSheetDialogFragment και ενσωμάτωση με Lifecycle-aware στοιχεία. Από το 2026, η Google συνιστά τη χρήση Fragment μόνο μέσω Jetpack Navigation, όχι απευθείας.

xml

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:startDestination="@+id/listFragment">

    <fragment
        android:id="@+id/listFragment"
        android:name=".ListFragment"
        android:label="Λίστα">
        <action
            android:id="@+id/action_list_to_detail"
            app:destination="@+id/detailFragment" />
    </fragment>

    <fragment
        android:id="@+id/detailFragment"
        android:name=".DetailFragment"
        android:label="Λεπτομέρειες" />
</navigation>

Συχνές ερωτήσεις

FragmentManager — τι είναι;

FragmentManager — κλάση που διαχειρίζεται συναλλαγές τμημάτων. Προσθέτει, αφαιρεί, αντικαθιστά τμήματα στο δοχείο Activity. Το FragmentManager αποκαθιστά την κατάσταση τμημάτων κατά την αναδημιουργία Activity και διαχειρίζεται τη στοίβα επιστροφής.

Σε τι διαφέρει το Fragment από το Activity;

Fragment — μέρος UI εντός Activity, δεν μπορεί να υπάρξει ανεξάρτητα. Το Fragment επιβιώνει αναδημιουργίας Activity κατά περιστροφή οθόνης. Activity — πλήρης οθόνη με δικό της Lifecycle, το Fragment εξαρτάται από το Lifecycle του Activity.

Πότε να χρησιμοποιήσετε Fragment αντί για Activity;

Fragment — όταν η οθόνη αποτελείται από πολλά ανεξάρτητα μπλοκ (καρτέλες, master-detail, προσαρμογή σε tablet). Activity — όταν η οθόνη δεν έχει επαναλαμβανόμενα μπλοκ. Η Google συνιστά Single Activity + πολλαπλά Fragment.

Πώς να μεταφέρετε δεδομένα μεταξύ Fragment;

Τρεις τρόποι: μέσω γονικού Activity (κοινό ViewModel), μέσω Fragment Result API (setFragmentResult), μέσω ορισμάτων Bundle κατά τη δημιουργία Fragment. ViewModel — προτιμώμενος τρόπος, καθώς τα δεδομένα διατηρούνται κατά την αναδημιουργία.

Τι είναι το Fragment Transaction;

Fragment Transaction — ατομική λειτουργία αλλαγής συνόλου τμημάτων. Το FragmentManager.beginTransaction() ανοίγει μια συναλλαγή όπου μπορούν να κληθούν add, remove, replace, hide, show. Κάθε συναλλαγή τελειώνει με commit() ή commitNow().

Σύνοψη

  • Fragment — επαναχρησιμοποιήσιμο στοιχείο UI εντός Activity με δικό του κύκλο ζωής, layout και κατάσταση
  • FragmentManager διαχειρίζεται συναλλαγές τμημάτων και αποκαθιστά την κατάστασή τους κατά την αναδημιουργία Activity
  • FragmentTransaction — ατομική λειτουργία προσθήκης, αντικατάστασης, αφαίρεσης και απόκρυψης τμημάτων
  • Κύκλος ζωής Fragment περιλαμβάνει έξι callback, από onAttach έως onDetach, με επιπλέον σημείο onCreateView
  • ViewModel — προτεινόμενος τρόπος ανταλλαγής δεδομένων μεταξύ τμημάτων στο ίδιο Activity
  • Fragment Result API παρέχει type-safe μεταφορά εφάπαξ γεγονότων μεταξύ τμημάτων

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης