Mengapa fragmen, dan kapan harus menggunakan fragmen, bukan aktivitas?

485

Di Android API 11+, Google telah merilis kelas baru yang disebut Fragment.

Dalam video, Google menunjukkan bahwa bila memungkinkan ( link1 , link2 ), kita harus menggunakan fragmen bukan kegiatan, tetapi mereka tidak menjelaskan mengapa.

Apa tujuan fragmen dan beberapa kemungkinan penggunaannya (selain beberapa contoh UI yang dapat dengan mudah dicapai dengan tampilan / tata letak sederhana)?

Pertanyaan saya adalah tentang fragmen:

  1. Apa tujuan menggunakan fragmen?
  2. Apa kelebihan dan kekurangan menggunakan fragmen dibandingkan dengan menggunakan aktivitas / tampilan / tata letak?

Pertanyaan bonus:

  1. Bisakah Anda memberikan beberapa kegunaan yang sangat menarik untuk fragmen? Hal-hal yang tidak disebutkan Google di video mereka?
  2. Apa cara terbaik untuk berkomunikasi antara fragmen dan aktivitas yang mengandungnya?
  3. Apa hal paling penting untuk diingat ketika Anda menggunakan fragmen? Adakah tip dan peringatan dari pengalaman Anda?
pengembang android
sumber

Jawaban:

282

# 1 & # 2 apa tujuan menggunakan fragmen & apa kelebihan dan kekurangan menggunakan fragmen dibandingkan dengan menggunakan aktivitas / tampilan / tata letak?

Fragmen adalah solusi Android untuk membuat antarmuka pengguna yang dapat digunakan kembali. Anda dapat mencapai beberapa hal yang sama menggunakan aktivitas dan tata letak (misalnya dengan menggunakan termasuk). Namun; fragmen ditransfer ke API Android, dari HoneyComb, dan ke atas. Biarkan saya uraikan;

  • The ActionBar. Jika Anda ingin tab di sana untuk menavigasi aplikasi Anda, Anda dengan cepat melihat bahwa ActionBar.TabListenerantarmuka memberi Anda FragmentTransactionsebagai argumen input ke onTabSelectedmetode. Anda mungkin dapat mengabaikan ini, dan melakukan sesuatu yang lain dan pintar, tetapi Anda akan bekerja melawan API, bukan dengan itu.

  • The FragmentManagermenangani «kembali» untuk Anda dalam cara yang sangat cerdas. Kembali tidak berarti kembali ke aktivitas terakhir, seperti untuk aktivitas reguler. Itu berarti kembali ke keadaan fragmen sebelumnya.

  • Anda dapat menggunakan fitur keren ViewPagerdengan a FragmentPagerAdapteruntuk membuat antarmuka gesek. The FragmentPagerAdapterkode jauh lebih bersih daripada adaptor biasa, dan ia mengendalikan instantiations dari fragmen individu.

  • Hidup Anda akan jauh lebih mudah jika Anda menggunakan Fragmen ketika Anda mencoba membuat aplikasi untuk ponsel dan tablet. Karena fragmennya sangat terkait dengan API Honeycomb +, Anda juga ingin menggunakannya pada ponsel untuk menggunakan kembali kode. Di situlah perpustakaan kompatibilitas sangat berguna.

  • Anda bahkan dapat dan harus menggunakan fragmen untuk aplikasi yang hanya ditujukan untuk ponsel. Jika Anda memiliki portabilitas dalam pikiran. Saya menggunakan ActionBarSherlockdan pustaka kompatibilitas untuk membuat aplikasi "ICS looking", yang terlihat sama sepanjang perjalanan kembali ke versi 1.6. Anda mendapatkan fitur terbaru seperti ActionBar, dengan tab, overflow, bilah tindakan perpecahan, viewpager dll

Bonus 2

Cara terbaik untuk berkomunikasi antar fragmen adalah niat. Saat Anda menekan sesuatu dalam Fragmen, Anda biasanya akan memanggilnya StartActivity()dengan data. Maksudnya diteruskan ke semua fragmen aktivitas yang Anda luncurkan.

Glenn Bech
sumber
5
pertama-tama, terima kasih. Saya menghargai orang-orang yang memberikan jawaban informatif (namun singkat) dan tidak hanya memberi saya tautan ke manual. Lagi pula, di samping fitur tambahan untuk bekerja di kelas khusus, dapatkah Anda memikirkan kelebihan dan kekurangan bekerja dengan fragmen ?
pengembang android
4
Saya pikir Anda harus lebih langsung bertanya. Saya baru saja memberikan empat keunggulan utama di atas.
Glenn Bech
2
ok, bagaimana dengan kerugiannya dibandingkan dengan tampilan dan aktivitas yang disesuaikan?
pengembang android
2
bagaimana Anda berkomunikasi antara fragmen menggunakan maksud? apakah semua fragmen harus "hidup" (ditambahkan ke aktivitas) agar mereka dapat berkomunikasi satu sama lain?
pengembang android
55
Satu fragmen tidak boleh berbicara langsung dengan fragmen lain - sebagai gantinya pergi melalui aktivitas induk. Dengan cara ini Anda tidak berakhir dengan kode spageti tetapi mudah mengelola kode.
slot
70

Tidak yakin video apa yang Anda maksud, tapi saya ragu mereka mengatakan Anda harus menggunakan fragmen alih-alih aktivitas, karena tidak dapat dipertukarkan secara langsung. Sebenarnya ada entri yang cukup terperinci dalam Panduan Dev, pertimbangkan untuk membacanya secara detail.

Singkatnya, fragmen hidup di dalam aktivitas, dan setiap aktivitas dapat menampung banyak fragmen. Seperti halnya aktivitas, mereka memiliki siklus hidup tertentu, tidak seperti aktivitas, mereka bukan komponen aplikasi tingkat atas. Keuntungan dari fragmen termasuk penggunaan kembali kode dan modularitas (misalnya, menggunakan tampilan daftar yang sama dalam banyak kegiatan), termasuk kemampuan untuk membangun antarmuka multi-pane (kebanyakan berguna pada tablet). Kerugian utama adalah (beberapa) menambah kompleksitas. Secara umum Anda dapat mencapai hal yang sama dengan tampilan (khusus) dengan cara yang tidak standar dan kurang kuat.

Nikolay Elenkov
sumber
1
pertanyaan terbaru. sekarang memiliki tautan ke video google. juga, terima kasih atas penjelasannya, tetapi saya masih perlu klarifikasi tentang pertanyaan saya.
Pengembang android
5
Baca entri panduan pengembangan, memiliki lebih dari cukup detail. Tidak mungkin Anda akan mendapatkan jawaban untuk 'penggunaan fragmen yang keren' pada SO - cara untuk kabur dan tidak ada jawaban tunggal. Nomor 4 secara khusus dijawab dalam panduan pengembang
Nikolay Elenkov
1
Sejauh yang saya tahu, metode ini menciptakan ketergantungan yang aktivitasnya dapat berisi fragmen mana. juga, harap jawab pertanyaan utama (dua yang pertama).
pengembang android
3
Terima kasih kepada pengembang android karena telah mendesak jawaban atas pertanyaan dasar. ATM Saya belum pernah melihat sesuatu yang berguna bagi saya di kelas Fragment atas penggunaan tag XML "include". Jenis hal yang saya anggap berharga adalah kemampuan untuk menentukan satu tata letak yang secara ajaib akan berubah menjadi pengalaman pengguna terbaik di semua resolusi. Dari apa yang saya tahu Anda masih perlu melakukannya dalam kode sendiri. Nilai potensial lain akan menjadi cara untuk menggabungkan kode + sumber daya ke dalam komponen yang dapat digunakan kembali yang tidak ditemukan dalam aplikasi yang menggunakan kembali, tetapi sekali lagi tampaknya tidak ada di sana. Saya ingin satu alasan yang sangat bagus.
Melinda Green
2
Saya mulai memahami cara Google menyarankan untuk menggunakan fragmen, tapi saya cukup setuju dengan @NikolayElenkov .. Bagi saya, menggunakan Aktivitas tampaknya masih menjadi cara yang paling kuat dan kurang kompleks ..
andrea.rinaldi
49

Fragmen adalah bagian dari antarmuka pengguna atau perilaku aplikasi yang dapat ditempatkan dalam Aktivitas yang memungkinkan desain aktivitas yang lebih modular. Tidak akan salah jika kita mengatakan sebuah fragmen adalah semacam subaktivitas.

Berikut ini adalah poin penting tentang sebuah fragmen:

  1. Sebuah fragmen memiliki tata letak dan perilaku sendiri dengan callback daur hidup sendiri.

  2. Anda dapat menambah atau menghapus fragmen dalam suatu aktivitas saat aktivitas sedang berjalan.

  3. Anda dapat menggabungkan beberapa fragmen dalam satu aktivitas untuk membangun UI multi-pane.

  4. Sebuah fragmen dapat digunakan dalam berbagai aktivitas.

  5. Siklus hidup fragmen terkait erat dengan siklus hidup aktivitas inangnya.

  6. Ketika aktivitas dijeda, semua fragmen yang tersedia dalam kegiatan juga akan dihentikan.

  7. Sebuah fragmen dapat mengimplementasikan perilaku yang tidak memiliki komponen antarmuka pengguna.

  8. Fragmen ditambahkan ke Android API di Android 3 (Honeycomb) dengan API versi 11.

Untuk detail lebih lanjut, silakan kunjungi situs resmi, Fragmen .

mani
sumber
1. Seperti yang Anda sebutkan di # 8, tidak harus memiliki tata letak. 6. Anda melewatkan bagian setelah "berarti". Bagaimanapun, terima kasih telah membantu orang lain membuat ini lebih jelas. Saya akan memberi Anda +1.
pengembang android
1
Mengenai # 8, contoh yang mungkin dari fragmen tanpa-tata letak (yaitu fragmen 'tanpa kepala') akan menjadi salah satu yang melakukan tugas yang meskipun agak pendek (seperti permintaan HTTP pendek) masih diperlukan untuk selamat dari perubahan konfigurasi dan karenanya tergantung pada instance fragmen yang tepat dipertahankan di mereka (dengan menggunakan setRetainInstance (true) pada fragmen). Adapun fragmen tata letak, setRetainInstance (true) tidak masuk akal, karena mencegah sumber daya yang terkait dengan pandangan mereka dibebaskan ketika diperlukan (yaitu kebocoran memori).
Piovezan
CATATAN: "# 8" sekarang "# 7".
ToolmakerSteve
21

Ini adalah informasi penting yang saya temukan pada fragmen:

Secara historis setiap layar dalam aplikasi Android diimplementasikan sebagai Aktivitas terpisah. Ini menciptakan tantangan dalam menyampaikan informasi antar layar karena mekanisme Android Intent tidak mengizinkan lewat jenis referensi (yaitu objek) langsung di antara Aktivitas. Sebaliknya objek harus serial atau referensi yang dapat diakses secara global tersedia.

Dengan membuat masing-masing layar Fragmen terpisah, data ini melewati sakit kepala benar-benar dihindari. Fragmen selalu ada dalam konteks Aktivitas yang diberikan dan selalu dapat mengakses Aktivitas itu. Dengan menyimpan informasi yang menarik di dalam Aktivitas, Fragmen untuk setiap layar dapat dengan mudah mengakses referensi objek melalui Aktivitas.

Sumber: https://www.pluralsight.com/blog/software-development/android-fragments

Kaveesh Kanwal
sumber
3
Itu benar, tetapi ada solusi untuk ini: gunakan Parcelable ketika itu bukan objek besar (dan ada plugin untuk membuatnya lebih mudah), dan jika itu adalah objek besar, Anda selalu dapat menggunakan referensi statis yang akan diatur ke nol ketika Anda sampai ke aktivitas baru (atau ketika Anda menghancurkannya, tergantung pada kebutuhan Anda).
pengembang android
@androiddeveloper: "use Parcelable" sesuai dengan definisi saya tentang "data lewat sakit kepala yang dihindari dengan menggunakan Fragmen". Jika ada keadaan bersama yang rumit yang perlu bertahan saat serangkaian layar berlalu, Activity + Fragmen adalah solusi yang bagus, IMHO. (Meskipun saya meninggalkan tumpukan back Fragment, dan mengelola sendiri apa arti "kembali".)
ToolmakerSteve
Menggunakan pola desain antarmuka antara fragmen melalui aktivitas wadah adalah pendekatan modular banyak untuk melewati tidak hanya objek tetapi juga mengklik pendengar acara dan metode argumen kembali ke fragmen lain atau ke aktivitas wadah utama.
Kaveesh Kanwal
10

Aktivitas adalah komponen layar penuh dalam aplikasi dengan bilah alat, semuanya adalah Fragmen. Satu aktivitas induk layar penuh dengan bilah alat dapat memiliki beberapa panel, halaman yang dapat digulir, dialog, dll. (Semua fragmen), yang semuanya dapat diakses dari induk dan berkomunikasi melalui induk.

Contoh:

Aktivitas A, Aktivitas B, Aktivitas C:

  • Semua aktivitas harus memiliki kode yang sama diulang, untuk menunjukkan toolbar dasar misalnya, atau mewarisi dari aktivitas induk (menjadi rumit untuk dikelola).
  • Untuk berpindah dari satu aktivitas ke aktivitas lainnya, semuanya harus dalam memori (overhead) atau satu harus dimusnahkan agar yang lain terbuka.
  • Komunikasi antar kegiatan dapat dilakukan melalui Intents.

vs.

Kegiatan A, Fragmen 1, Fragmen 2, Fragmen 3:

  • Tidak ada pengulangan kode, semua layar memiliki toolbar dll dari satu aktivitas itu.
  • Beberapa cara untuk berpindah dari satu fragmen ke fragmen berikutnya - lihat pager, multi panel dll.
  • Aktivitas memiliki sebagian besar data, sehingga komunikasi antar-fragmen minimal diperlukan. Jika masih perlu, bisa dilakukan melalui antarmuka dengan mudah.
  • Fragmen tidak perlu layar penuh, banyak fleksibilitas dalam mendesainnya.
  • Fragmen tidak perlu mengembang tata letak jika tampilan tidak diperlukan.
  • Beberapa aktivitas dapat menggunakan fragmen yang sama.
Chandrima Bhattacharjee
sumber
jawaban sempurna!
Sathesh
8

Fragmen digunakan secara khusus dalam beberapa kasus seperti di mana kami ingin menyimpan laci navigasi di semua halaman kami. Anda dapat mengembang tata letak bingkai dengan fragmen apa pun yang Anda inginkan dan masih memiliki akses ke laci navigasi.

Jika Anda telah menggunakan suatu kegiatan, Anda harus menyimpan laci di semua kegiatan yang membuat kode berlebihan. Ini adalah salah satu penggunaan fragmen yang menarik.

Saya baru mengenal Android dan masih berpikir sebuah fragmen bermanfaat dengan cara ini.

Nithin Baby
sumber
Iya. Namun, saya kadang-kadang masih bingung tentang cara yang benar untuk menggunakan fragmen, dan itu karena siklus hidup fragmen dan aktivitas yang kompleks.
pengembang android
@androiddeveloper apakah Anda hanya menggunakan sebagian besar kegiatan?
Michael Alan Huff
@MichaelAlanHuff Saat mendukung tablet, saya pikir lebih baik menggunakan Fragmen. Juga, ketika mendukung perubahan orientasi dan acara serupa lainnya, Anda mungkin ingin menggunakan DialogFragment, karena memungkinkan Anda untuk mengembalikannya
pengembang android
@androiddeveloper, itulah yang saya pikirkan juga. Saya belum sering menggunakan DialogFragments. Untuk membantu modularitas logika, banyak pengembang android mulai menggunakan tampilan khusus untuk memegang mortar a la square logika. Berikut ini adalah pembicaraan terbaru tentang pandangan khusus yang diberikan oleh seorang insinyur dari Airbnb vimeo.com/127799187
Michael Alan Huff
@MichaelAlanHuff menggunakan fragmen bisa juga berguna jika Anda berpikir layar saat ini bisa menjadi bagian dari layar lain.
pengembang android
5

Saya tahu ini sudah dibahas sampai mati, tetapi saya ingin menambahkan beberapa poin lagi:

  • Frag dapat digunakan untuk mengisi Menudan menangani MenuItemklik sendiri. Dengan demikian memberikan opsi modulasi lebih lanjut untuk Aktivitas Anda. Anda dapat melakukan hal-hal ContextualActionBar dan seterusnya tanpa Aktivitas Anda mengetahuinya dan pada dasarnya dapat memisahkannya dari hal-hal dasar yang ditangani oleh Aktivitas Anda (Navigasi / Pengaturan / Tentang).

  • Orang tua Frag dengan anak Frags dapat memberi Anda opsi lebih lanjut untuk memodulasi komponen Anda. Misalnya Anda dapat dengan mudah bertukar Frags di sekitar, meletakkan Frags baru di dalam Pager atau menghapusnya, mengatur ulang mereka. Semua tanpa Aktivitas Anda mengetahui sesuatu tentang hal itu hanya berfokus pada hal-hal tingkat yang lebih tinggi.

einschnaehkeee
sumber
0

Fragmen hidup dalam Kegiatan dan memiliki:

  • siklus hidupnya sendiri
  • tata letaknya sendiri
  • fragmen anak sendiri dan lain-lain

Pikirkan Fragmen sebagai sub kegiatan dari aktivitas utama yang dimilikinya, tidak dapat eksis sendiri dan dapat dipanggil / digunakan kembali berulang kali. Semoga ini membantu :)

maniix
sumber
Sebenarnya, tentang poin kedua ("tata letaknya sendiri"), ini opsional. Sebuah fragmen tidak harus memiliki pandangan sama sekali.
pengembang android
0

1.Tujuan menggunakan fragmen?

  • Jawab:
    1. Berurusan dengan perbedaan faktor bentuk perangkat.
    2. Melewati informasi antar layar aplikasi.
    3. Organisasi antarmuka pengguna.
    4. Metafora UI tingkat lanjut.
Prithiv Dharmaraj
sumber
0

Sebuah fragmen hidup di dalam suatu aktivitas, sementara sebuah aktivitas hidup dengan sendirinya.

superkytoz
sumber
6
"dengan sendirinya"? Mungkin "sendiri"? Atau "dengan sendirinya"?
Peter Mortensen