Berapa banyak Kegiatan vs Fragmen?

185

Pengantar:

Pola dasar "Tutorial Fragmen" berbunyi seperti ini:

  1. Di tablet, ada daftar di sebelah kiri, detail di sebelah kanan.
  2. Keduanya Fragmentsdan keduanya berada di tempat yang sama Activity.
  3. Di telepon, buat daftar Fragmentdalam satu Activity.
  4. Luncurkan yang baru Activitydengan detailnya Fragment.

(mis. Android 3.0 Fragments API oleh Dianne Hackborn dan the Fragments API Guide )

Di kedua perangkat, fungsionalitas ada di Fragments. (sederhana)

Di Tablet , seluruh aplikasi adalah 1Activity , di telepon , ada banyakActivities .


Pertanyaan:

  • Apakah ada alasan untuk membagi aplikasi ponsel menjadi banyak Activities?

Satu masalah dengan metode ini, adalah Anda menduplikasi banyak logika di Tablet utama Activity, dan di Telepon terpisah Activities.

  • Tidakkah akan lebih mudah untuk mempertahankan model 1 Aktivitas dalam kedua kasus, menggunakan logika yang sama untuk beralih Fragmentsmasuk dan keluar (hanya menggunakan tata letak yang berbeda)?

Dengan cara ini sebagian besar logika berada di dalam Fragmentsdirinya sendiri, dan hanya ada satu Activity- lebih sedikit duplikasi kode.

Juga apa yang saya baca tentang ActionBarSherlockitu tampaknya bekerja paling baik dengan Fragmentsbukan Activities(tapi saya belum bekerja dengannya).

Apakah tutorialnya terlalu disederhanakan, atau sudahkah saya melewatkan sesuatu yang utama dalam pendekatan ini?


Kami telah mencoba kedua pendekatan dengan sukses di kantor - tetapi saya akan memulai proyek yang lebih besar dan ingin membuat semuanya semudah mungkin bagi diri saya sendiri.

Beberapa tautan ke pertanyaan terkait:


Pembaruan

Mulai karunia pada pertanyaan - masih tidak yakin tentang mengapa saya perlu menduplikasi logika aplikasi saya di aktivitas tablet saya dan di setiap aktivitas ponsel.

Juga menemukan artikel yang menarik oleh orang-orang di Square, yang layak dibaca:

Richard Le Mesurier
sumber
38
+1 untuk pertanyaan yang luar biasa, dan ditulis dengan baik.
Siddharth Lele
itu adalah sesuatu yang sangat menyakitkan saya hari ini, saat ini saya sedang mengerjakan sebuah aplikasi yang desainnya mencakup banyak fragmen dan akan tersedia di ponsel dan tablet, saya sedang mencari jalan tengah, tetapi belum dapat menemukannya ...
Nixit Patel
1
Jujur saya maksudkan jangan tersinggung tapi saya pikir Anda baru saja menerima apa yang ingin Anda dengar daripada jawaban yang sebenarnya. Jawaban Scuba tidak direkomendasikan oleh Google dan posting blog yang saya suka jelaskan alasannya.
pjco
1
@ pjco Secara khusus saya tidak setuju dengan memiliki onItemSelected()metode dalam Aktivitas. Di aplikasi "asli" saya, saya punya banyak daftar & sublists. Pola ini menunjukkan bahwa Aktivitas Tab saya harus memiliki onItemSelected()metode untuk menangani masing-masing daftar. Ditambah Aktivitas Telepon masing-masing harus memiliki logika yang sama digandakan di dalam masing-masing. IMHO itu jauh lebih baik untuk menempatkan logika Item Selected ke masing-masing Fragmen - tidak ada duplikasi dan saya lebih suka cara penataan kode. Saya harap ini membantu
Richard Le Mesurier
2
Saya saat ini terpaku pada dilema ini di tempat kerja. Fragmen memuat lebih cepat daripada meluncurkan aktivitas baru, jadi saya mulai menerapkan arsitektur aktivitas tunggal. Saya mengalami masalah, yang sepertinya saya tidak bisa menemukan cara yang baik untuk mendukung konfigurasi multi-fragmen tanpa melakukan sesuatu yang hacky. Lihat pertanyaan ini .
theblang

Jawaban:

41

Saya setuju bahwa tutorialnya sangat disederhanakan. Mereka hanya memperkenalkan Fragmentstetapi saya tidak setuju dengan pola seperti yang disarankan.

Saya juga setuju bahwa itu bukan ide yang baik untuk menduplikasi logika aplikasi Anda di banyak Kegiatan (lihat Prinsip KERING di wikipedia ).


Saya lebih suka pola yang digunakan oleh ActionBarSherlockaplikasi Demo Fragmen ( unduh di sini dan kode sumber di sini ). Demo yang paling cocok dengan tutorial yang disebutkan dalam pertanyaan adalah yang disebut "Layout" di aplikasi; atau FragmentLayoutSupportdalam kode sumber.

Dalam demo ini, logikanya telah dipindahkan dari Activitydan ke Fragment. The TitlesFragmentsebenarnya mengandung logika untuk mengubah Fragmen. Dengan cara ini, setiap Kegiatan sangat sederhana. Untuk menduplikasi banyak Aktivitas yang sangat sederhana, di mana tidak ada logika di dalam Aktivitas, membuatnya sangat sederhana.

Dengan memasukkan logika ke dalam Fragmen, tidak perlu menulis kode lebih dari sekali ; itu tersedia terlepas dari Kegiatan yang fragmen ditempatkan. Ini membuatnya menjadi pola yang lebih kuat daripada yang disarankan oleh tutorial dasar.

    /**
    * Helper function to show the details of a selected item, either by
    * displaying a fragment in-place in the current UI, or starting a
    * whole new activity in which it is displayed.
    */
    void showDetails(int index)
    {
        mCurCheckPosition = index;

        if (mDualPane)
        {
            // We can display everything in-place with fragments, so update
            // the list to highlight the selected item and show the data.
            getListView().setItemChecked(index, true);

            // Check what fragment is currently shown, replace if needed.
            DetailsFragment details = (DetailsFragment) getFragmentManager()
                .findFragmentById(R.id.details);
            if (details == null || details.getShownIndex() != index)
            {
                // Make new fragment to show this selection.
                details = DetailsFragment.newInstance(index);

                // Execute a transaction, replacing any existing fragment
                // with this one inside the frame.
                FragmentTransaction ft = getFragmentManager()
                    .beginTransaction();
                ft.replace(R.id.details, details);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
                ft.commit();
            }

        }
        else
        {
            // Otherwise we need to launch a new activity to display
            // the dialog fragment with selected text.
            Intent intent = new Intent();
            intent.setClass(getActivity(), DetailsActivity.class);
            intent.putExtra("index", index);
            startActivity(intent);
        }
    }

Keuntungan lain dari pola ABS adalah bahwa Anda tidak berakhir dengan Aktivitas Tablet yang mengandung banyak logika, dan itu berarti Anda menghemat memori. Pola tutorial dapat mengarah ke aktivitas utama yang sangat besar di aplikasi yang lebih kompleks; karena itu perlu menangani logika semua fragmen yang ditempatkan di dalamnya kapan saja.

Secara keseluruhan, jangan menganggapnya sebagai dipaksa untuk menggunakan banyak kegiatan. Anggap saja memiliki kesempatan untuk membagi kode Anda menjadi banyak fragmen, dan menghemat memori saat menggunakannya.

Stephen Asherson
sumber
thx untuk jawaban yang komprehensif - Saya telah melihat demo ABS, dan saya pikir ada banyak kode bagus di sana. Saya akan mencoba untuk memindahkan banyak logika saya sebagai gantinya
Richard Le Mesurier
Aplikasi Demo telah pindah ke sini: play.google.com/store/apps/…
Philipp E.
Saya pikir pola yang Anda gambarkan adalah dari kode sampel Google asli: android-developers.blogspot.com/2011/02/... Saya pikir ActionBarSherlock baru saja mem-porting kode demo Google untuk menggunakan kelas ABS.
Dan J
17

Saya pikir Anda berada di jalur yang benar. (Dan ya, tutorialnya terlalu disederhanakan).

Dalam tata letak tablet, Anda dapat menggunakan satu Aktivitas dan menukar masuk dan keluar Fragmen (dalam beberapa 'panel'). Saat berada di tata letak ponsel, Anda dapat menggunakan Aktivitas baru untuk setiap Fragmen.

Seperti itu:

masukkan deskripsi gambar di sini

Ini mungkin tampak seperti banyak pekerjaan tambahan, tetapi dengan menggunakan beberapa aktivitas untuk ponsel, Anda mengaktifkan daur hidup Aktivitas dasar dan Intent passing. Ini juga memungkinkan kerangka kerja untuk menangani semua animasi dan tumpukan-kembali.

Untuk membantu mengurangi kode Anda dapat menggunakan BaseActivitydan memperluas dari itu.

Jadi, jika pengguna memiliki tablet, Anda akan menggunakan MyMultiPaneFragActivityatau sesuatu yang serupa. Aktivitas ini bertanggung jawab untuk mengelola panggilan balik dari fragmen dan tujuan perutean ke fragmen yang benar (seperti maksud pencarian)

Jika pengguna memiliki telepon, Anda dapat menggunakan Aktivitas biasa dengan kode yang sangat sedikit dan memperpanjangnya MyBaseSingleFragActivityatau yang serupa. Kegiatan ini bisa sangat sederhana, 5-10 baris kode (bahkan mungkin kurang).

Bagian yang sulit adalah mengarahkan maksud dan yang lainnya. * (Edit: lihat lebih lanjut di bawah).

Saya pikir alasan ini adalah cara yang disarankan adalah untuk menghemat memori dan mengurangi kerumitan dan kopling. Jika Anda menukar Fragmen, FragmentManagermempertahankan referensi untuk Fragmen untuk tumpukan-kembali. Ini juga menyederhanakan apa yang seharusnya 'berjalan' untuk pengguna. Pengaturan ini juga memisahkan pandangan dan tata letak dan logika dalam Fragmen dari siklus hidup Aktivitas. Dengan cara ini Fragmen dapat ada dalam satu aktivitas, di samping fragmen lain (dua-pane), atau dalam Aktivitas tiga-pane, dll.

* Salah satu manfaat memiliki perutean maksud reguler adalah Anda dapat meluncurkan suatu Kegiatan secara eksplisit dari mana saja di tumpukan belakang. Salah satu contoh mungkin dalam hal hasil pencarian. (MySearchResults.class).

Baca di sini untuk informasi lebih lanjut:

http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html

Ini mungkin pekerjaan yang sedikit lebih awal, karena masing-masing fragmen harus bekerja dengan baik di aktivitas yang berbeda, tetapi biasanya terbayar. Ini berarti bahwa Anda dapat menggunakan file tata letak alternatif yang menentukan berbagai kombinasi fragmen, menjaga modular kode fragmen, menyederhanakan manajemen bilah tindakan, dan membiarkan sistem menangani semua pekerjaan tumpukan belakang.

pjco
sumber
Dapatkan keuntungan MySearchResults - Anda menyarankan memiliki cara berbeda untuk menanggapi maksud itu tergantung pada handset atau tablet - mengapa ini lebih baik daripada memiliki aktivitas tunggal yang merespons dalam kedua kasus? Anda menyarankan, di Tablet tidak ada perutean maksud reguler - jadi Anda harus menyelesaikan masalah untuk tablet. Mengapa tidak menggunakan solusi itu di handset juga?
Richard Le Mesurier
Keuntungan di sini adalah bahwa kode tablet Anda dapat diharapkan untuk merutekan ke beberapa panel. Terkadang Anda ingin mengubah beberapa panel dengan satu tujuan. Seperti hasil pencarian di sebelah kiri dengan detial dari item pertama di panel yang lebih besar di sebelah kanan. Kode ini tidak akan portabel untuk tata letak tunggal.
pjco
Mengapa ok untuk beralih fragmen ketika ada banyak, tetapi jika hanya 1 fragmen terlihat, saya tidak boleh beralih ke fragmen lain?
Richard Le Mesurier
Tidak yakin saya mengerti apa yang Anda maksud, tetapi untuk memperjelas komentar saya di atas: Kadang-kadang Anda mungkin ingin mengubah lebih dari 1 fragmen pada saat yang sama dalam tata letak multi-fragmen. Ini membutuhkan kode untuk mengubah 2 fragmen, yang tidak akan Anda gunakan kembali dalam tata letak fragmen tunggal
pjco
Sama-
6

Berikut ini adalah jawaban Reto Meier mengenai hal yang sama, yang diambil dari video ini dari tentu saja Android Fundamental Udacity ini .

Ada sejumlah alasan mengapa Anda sebaiknya memecah aplikasi menjadi berbagai aktivitas.

  • Memiliki aktivitas monolitik tunggal meningkatkan kompleksitas kode Anda, sehingga sulit untuk membaca, menguji, dan memelihara.
  • Membuat membuat dan mengelola filter maksud jauh lebih sulit.
  • Meningkatkan risiko pemasangan komponen independen yang erat.
  • Membuatnya lebih mungkin menimbulkan risiko keamanan jika aktivitas tunggal tersebut mencakup informasi sensitif dan informasi yang aman untuk dibagikan.

Aturan praktis yang baik adalah membuat aktivitas baru kapan pun konteksnya berubah. Misalnya, menampilkan berbagai jenis data dan saat beralih dari melihat ke memasukkan data.

Aditya Naique
sumber
Yang menarik, judul videonya adalah "Mengapa Kita Tidak Hanya Menggunakan Fragmen"
Richard Le Mesurier
itu adalah pendekatan yang baik, saya menghadapi banyak masalah dengan aktivitas tunggal beberapa fragmen ... exp nyata mungkin
GvSharma
4

Satu masalah dengan metode ini, adalah Anda menduplikasi banyak logika di Aktivitas Tablet utama, dan di Aktivitas Telepon terpisah.

Dalam pola master-detail, ada dua kegiatan. Satu menunjukkan kedua fragmen pada layar yang lebih besar dan hanya fragmen "master" pada layar yang lebih kecil. Yang lain menunjukkan fragmen "detail" pada layar yang lebih kecil.

Logika detail Anda harus diikat ke dalam fragmen detail. Oleh karena itu, tidak ada duplikasi kode yang terkait dengan logika detail antara aktivitas - aktivitas detail hanya menampilkan fragmen detail, mungkin meneruskan data dari Intentekstra.

Juga apa yang saya baca tentang ActionBarSherlock adalah tampaknya berfungsi paling baik dengan Fragmen daripada Aktivitas (tapi saya belum bekerja dengannya).

ActionBarSherlock tidak lebih terkait dengan fragmen daripada bilah tindakan asli, karena ActionBarSherlock adalah murni backport dari bilah tindakan asli.

CommonsWare
sumber
Apa pendapat Anda tentang ide kegiatan tunggal?
theblang
@ Mattblang: Selama Anda mendapatkan navigasi yang benar, tidak ada masalah dengan itu.
CommonsWare
1
Saya telah mencoba refactoring ke arsitektur aktivitas tunggal karena mengganti sebuah fragmen jauh lebih cepat daripada meluncurkan aktivitas baru dengan fragmen yang sama di dalamnya. Saya merasa seperti saya mengalami terlalu banyak hambatan, seperti ini . Sebagian besar contoh yang saya temukan online, terutama untuk konfigurasi multi-fragmen seperti detail-master, tidak menggunakan aktivitas tunggal. Jadi saya berada dalam sedikit dilema.
theblang
0

Mengacu pada pertanyaan pertama "Apakah ada alasan untuk membagi aplikasi ponsel menjadi banyak Kegiatan?" - Iya. itu hanya datang ke ruang yang tersedia, Tablet memberi lebih banyak ruang untuk pengembang, sehingga memungkinkan pengembang untuk menempatkan lebih banyak di satu layar. Android memberi tahu kami bahwa Aktivitas dapat menyediakan layar . Jadi Yang dapat Anda lakukan dengan 1 layar besar di tablet, adalah sesuatu yang mungkin harus disebar di beberapa layar di ponsel, karena tidak ada ruang yang cukup untuk semua fragmen.

EFlisio
sumber
Kalimat pertama - "Suatu Aktivitas adalah komponen aplikasi yang menyediakan layar tempat pengguna dapat berinteraksi untuk melakukan sesuatu,". Saya memang melihat kesalahan dalam pernyataan asli saya, saya tidak bermaksud untuk menempatkan "adalah layar lain",
EFlisio