Fragment — επαναχρησιμοποιήσιμο στοιχείο UI στο Android, που ενσωματώνεται σε Activity και διαχειρίζεται μέσω FragmentManager. Κάθε τμήμα έχει τον δικό του κύκλο ζωής, layout και κατάσταση. Το Fragment διευκολύνει την προσαρμογή σε διαφορετικά μεγέθη οθόνης και την επαναχρησιμοποίηση κώδικα. Διαβάστε περισσότερα στον επίσημο οδηγό Google.
Κύρια σημεία
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 είναι πιο περίπλοκος από αυτόν του Activity, καθώς εξαρτάται από την κατάσταση του Activity-οικοδεσπότη. Το Fragment περνά από τις ίδιες καταστάσεις με το Activity, αλλά προσθέτει δικά του callback: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Callback Fragment | Αντιστοιχία Activity | Σκοπός |
|---|---|---|
| onAttach | πριν από onCreate | Fragment συνδέθηκε με Activity |
| onCreate | onCreate | Αρχικοποίηση δεδομένων μη σχετικών με UI |
| onCreateView | onCreate | Δημιουργία layout μέσω inflater |
| onViewCreated | onCreate | Σύνδεση στοιχείων UI μετά τη δημιουργία view |
| onDestroyView | onDestroy | Αφαίρεση view, απελευθέρωση πόρων UI |
| onDetach | onDestroy | Fragment αποσυνδέθηκε από Activity |
Η κύρια διαφορά του κύκλου ζωής Fragment — η κλήση onCreateView και onDestroyView μεταξύ onCreate και onDestroy. Το Fragment μπορεί να υπάρχει χωρίς UI (αν το onCreateView επιστρέφει null). Μετά την αναδημιουργία του Activity, το FragmentManager αποκαθιστά αυτόματα τα τμήματα.
FragmentManager — κεντρική κλάση για διαχείριση τμημάτων σε Activity. Είναι υπεύθυνη για την προσθήκη, αφαίρεση, αντικατάσταση τμημάτων, διαχείριση στοίβας επιστροφής και αποκατάσταση κατάστασης. Το FragmentManager είναι προσβάσιμο μέσω supportFragmentManager (AndroidX) ή fragmentManager (παλιό API).
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 με παράδειγμα σε Kotlin. Η onCreateView δημιουργεί layout — σε αντίθεση με το Activity, η μέθοδος πρέπει να επιστρέψει View. Η onViewCreated καλείται αμέσως μετά, εδώ είναι ασφαλής η εύρεση στοιχείων κατά id. Η onDestroyView — η τελευταία στιγμή για καθαρισμό αναφορών στο view.
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 — για δεδομένα κατά τη δημιουργία τμήματος.
// Κοινό 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 και Activity εξαρτάται από την αρχιτεκτονική της εφαρμογής. Το Fragment είναι υποχρεωτικό για προσαρμοστικά layouts (τηλέφωνο + tablet), για προσαρμοσμένη κινούμενη εικόνα μεταβάσεων και για χρήση Jetpack Navigation. Το Activity προτιμάται για απλές εφαρμογές με μία-δύο οθόνες.
| Κριτήριο | Fragment | Activity |
|---|---|---|
| Ταχύτητα δημιουργίας | Γρηγορότερο (ελαφρύ στοιχείο) | Αργότερο (διεργασία συστήματος) |
| Επαναχρησιμοποίηση | Υψηλή (ένα τμήμα σε διαφορετικά Activity) | Χαμηλή (κάθε οθόνη — δικό της Activity) |
| Κινούμενη εικόνα μεταβάσεων | Ευέλικτη (FragmentTransaction) | Περιορισμένη (overridePendingTransition) |
| Αποθήκευση κατά περιστροφή | Αυτόματη (διαχειριστής αποκαθιστά) | Χειροκίνητη (onSaveInstanceState) |
| Deep Links | Μέσω Navigation Component | Εγγενής υποστήριξη μέσω intent-filter |
Η σύγχρονη προσέγγιση εργασίας με 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, όχι απευθείας.
<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 — κλάση που διαχειρίζεται συναλλαγές τμημάτων. Προσθέτει, αφαιρεί, αντικαθιστά τμήματα στο δοχείο Activity. Το FragmentManager αποκαθιστά την κατάσταση τμημάτων κατά την αναδημιουργία Activity και διαχειρίζεται τη στοίβα επιστροφής.
Fragment — μέρος UI εντός Activity, δεν μπορεί να υπάρξει ανεξάρτητα. Το Fragment επιβιώνει αναδημιουργίας Activity κατά περιστροφή οθόνης. Activity — πλήρης οθόνη με δικό της Lifecycle, το Fragment εξαρτάται από το Lifecycle του Activity.
Fragment — όταν η οθόνη αποτελείται από πολλά ανεξάρτητα μπλοκ (καρτέλες, master-detail, προσαρμογή σε tablet). Activity — όταν η οθόνη δεν έχει επαναλαμβανόμενα μπλοκ. Η Google συνιστά Single Activity + πολλαπλά Fragment.
Τρεις τρόποι: μέσω γονικού Activity (κοινό ViewModel), μέσω Fragment Result API (setFragmentResult), μέσω ορισμάτων Bundle κατά τη δημιουργία Fragment. ViewModel — προτιμώμενος τρόπος, καθώς τα δεδομένα διατηρούνται κατά την αναδημιουργία.
Fragment Transaction — ατομική λειτουργία αλλαγής συνόλου τμημάτων. Το FragmentManager.beginTransaction() ανοίγει μια συναλλαγή όπου μπορούν να κληθούν add, remove, replace, hide, show. Κάθε συναλλαγή τελειώνει με commit() ή commitNow().
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης