Apa manfaat menggunakan Fragmen di Android, daripada Tampilan?

102

Saat mengembangkan untuk Android, Anda bisa menyetel target (atau minimum) sdk ke 4 (API 1.6) dan menambahkan paket kompatibilitas android (v4) untuk menambahkan dukungan Fragments. Kemarin saya melakukan ini dan berhasil menerapkan Fragmentsuntuk memvisualisasikan data dari kelas khusus.

Pertanyaan saya adalah ini: apa keuntungan menggunakan Fragmentsdibandingkan dengan hanya mendapatkan View dari objek kustom, dan masih mendukung API 1.5?

Misalnya, saya memiliki kelas Foo.java:

public class Foo extends Fragment {

    /** Title of the Foo object*/
    private String title;
    /** A description of Foo */
    private String message;

    /** Create a new Foo
     * @param title
     * @param message */
    public Foo(String title, String message) {
        this.title = title;
        this.message = message;
    }//Foo

    /** Retrieves the View to display (supports API 1.5. To use,
     * remove 'extends Fragment' from the class statement, along with
     * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) 
     * @param context Used for retrieving the inflater */
    public View getView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//getView 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }
        View v = inflater.inflate(R.layout.foo, null);
        TextView t = (TextView) v.findViewById(R.id.title);
        t.setText(this.title);
        TextView m = (TextView) v.findViewById(R.id.message);
        m.setText(this.message);
        return v;
    }//onCreateView

}//Foo

Kedua metode tersebut sangat sederhana untuk dibuat dan digunakan dalam sebuah Aktivitas yang, katakanlah, harus List<Foo>ditampilkan (misalnya, secara terprogram menambahkan masing-masing ke a ScrollView), jadi Fragmentsbenar - benar semua itu berguna, atau apakah itu hanya penyederhanaan yang terlalu dimuliakan. mendapatkan View, seperti melalui kode di atas?

Phil
sumber
2
Fragmen tidak harus memiliki UI, mereka hanya dapat digunakan kembali. Tampilan A akan menjadi mubazir dalam kasus itu.
Philipp Reichart
Saya telah menjawab ini di pertanyaan lain. Lihat stackoverflow.com/a/14912608/909956 T; dr - terkadang fragmen memungkinkan Anda membuat lebih banyak komponen yang dapat digunakan kembali daripada mengandalkan implementasi tampilan kustom. lihat tautan untuk alasannya.
numan salati

Jawaban:

172

Alasan utama menggunakan Fragmen adalah karena fitur backstack dan siklus proses. Jika tidak, tampilan kustom lebih ringan dan lebih mudah diterapkan.

Awalnya, saya benar-benar mencoba membuat aplikasi ponsel / tablet menggunakan tampilan khusus. Semuanya tampak berfungsi di seluruh ponsel DAN tablet, bahkan beralih dari satu panel ke panel terpisah. Di mana saya mengalami masalah adalah dengan tombol kembali dan siklus hidup. Karena saya hanya memperbarui tampilan secara manual ... tidak ada yang melacak riwayat tampilan dan statusnya. Oleh karena itu, tombol kembali tidak berfungsi seperti yang diharapkan dan sulit untuk membuat ulang bahkan status terbaru selama peristiwa siklus hidup, seperti saat memutar aplikasi. Untuk memperbaikinya, saya harus membungkus tampilan kustom saya dalam fragmen dan menggunakan FragmentManager sehingga status sebelumnya akan disimpan dan dibuat ulang.

Saya menyadari setelah menjawab bahwa saya memposting pertanyaan serupa setahun sebelumnya: https://stackoverflow.com/a/11126397/618881

Henry
sumber
14
Jawaban yang sangat bagus. Saya hanya ingin menambahkan bahwa fragmen dapat bersarang sejak 4.2 atau perpustakaan dukungan rev 11.
kar
2
Terima kasih @Karlo untuk pembaruannya. Saya tidak berpikir itu mungkin secara konseptual, tetapi mereka mengatasinya dengan menggunakan FragmentManager pribadi melalui getChildFragmentManager (). Oh, dan itu adalah API 17, bukan 11, dan tersedia melalui Pustaka Dukungan.
Henry
2
Saya baru saja melihat pertanyaan ini lagi, dan pengalaman saya juga berubah. Ini adalah jawaban yang memberikan pemahaman yang baik tentang keuntungan dan kerugian, dan sangat membantu. Terima kasih!
Phil
2
Ingin memberi jawaban ini +1, tetapi melakukan itu akan merusak skor saat ini. Selain itu, 70 bukanlah angka favorit saya.
Behnam
1
untuk tahun lalu, saya juga berpikir bahwa Fragments tidak menyediakan fitur luar biasa, tetapi saya mengalami bahwa setelah mengklik kembali aktivitas saya kehilangan semua gambar yang diunduh di dalamnya, jadi harus menambahkan implementasi cache, sekarang saya berpikir untuk menggunakan fragmen itu mungkin sangat mudah
Shirish Herwade
27

Menurut saya, Fragmen berguna dalam dua skenario: jika Anda membagi tampilan pada beberapa perangkat / orientasi dan menampilkannya dalam dua aktivitas dan menampilkan semua konten di satu perangkat lain. Itu akan menjadi kasus penggunaan jika Anda menggunakan tablet atau bahkan mungkin dalam mode lanskap di ponsel: misalnya Anda menampilkan daftar item dan detailnya pada satu layar. di ponsel atau dalam mode potret Anda hanya menampilkan satu bagian.

Kasus penggunaan lainnya adalah tampilan yang dapat digunakan kembali. Jadi, jika Anda memiliki beberapa tampilan yang terlihat pada aktivitas berbeda dan juga melakukan beberapa tindakan, Anda dapat menempatkan perilaku ini ke dalam sebuah fragmen lalu menggunakannya kembali. Jelas Anda mungkin bisa melakukannya dengan widget khusus juga.

Saya tidak melihat alasan apa pun untuk menggunakan Fragmen untuk setiap Tampilan dan saya rasa itu hanya akan menjadi overhead. Saya hanya menggunakannya dalam kasus penggunaan pertama dan saya akan mengatakan di sini ini adalah penyederhanaan.

Maria Neumayer
sumber
Terima kasih, ini sangat membantu. Saya pikir saya akan tetap berpegang pada pandangan dan membuat 'tumpukan belakang' saya sendiri untuk membuatnya dapat digunakan kembali.
Phil
3

Android memperkenalkan fragmen di Android 3.0 (API level 11), terutama untuk mendukung desain UI yang lebih dinamis dan fleksibel di layar besar, seperti tablet. Karena layar tablet jauh lebih besar daripada layar handset, ada lebih banyak ruang untuk menggabungkan dan menukar komponen UI. Fragmen memungkinkan desain seperti itu tanpa Anda perlu mengelola perubahan kompleks pada hierarki tampilan. Dengan membagi tata letak aktivitas menjadi beberapa fragmen, Anda bisa mengubah tampilan aktivitas pada waktu proses dan mempertahankan perubahan tersebut di back-stack yang dikelola oleh aktivitas.

Di sini Anda dapat membaca lebih lanjut.

Yury
sumber
Saya telah membaca semua dokumentasi, namun saya mencari sesuatu yang lebih menjelaskan manfaatnya, seperti untuk tablet atau backstack
Phil
3
  1. Layar Scenario Activity Split - Kami memiliki Satu Tata Letak dan satu aktivitas yang menangani bagian layar kiri kanan
  2. Scenario FragmentActivity kita memiliki satu layout untuk layar Utama, satu untuk kiri dan kanan

Skenario satu bagus jika Anda memiliki aplikasi sederhana.

Skenario dua bagus jika Anda ingin memiliki Banyak Fragmen dan beberapa FragmenActivities dan Anda dapat menggabungkan masing-masing. Anda juga dapat membuat interaksi antar fragmen.

Saya telah membagi Fragmentactivity layar, saya dapat memanggilnya dengan 'Intent Extras' dan memberi tahu fragmentActivity fragmen mana yang akan dimuat. Fragmen bagus karena tidak dalam bentuk manifes sehingga Anda dapat membuat fragmen dan FragmentActvity yang dapat digunakan kembali.

Tapi itu membuat proyek Anda lebih besar. Tetapi jika Anda membuat proyek besar, Anda dapat menghemat banyak. Karena Anda dapat menggunakan Fragmen yang sama atau aktivitas Fragmen yang sama.

Dan saya pikir fragmen ini datang sedikit terlambat jadi Anda harus mencoba berpikir dengan cara baru. Mungkin hanya mencoba mengubah aktivitas Anda menjadi FragmentActivity. Kemudian coba temukan kode yang dapat digunakan kembali dan buat Fragmen darinya.

Ini berguna tetapi saya tidak tahu caranya sekarang. Tapi saya punya beberapa ide.

Ini selalu menjadi masalah. Tim Android membuat sesuatu berpikir dan tidak ada yang tahu kegunaannya. Karena kita hampir tidak belajar seperti dulu dan ini dia beberapa hal baru.

Menurut saya itu bagus tapi bukan karena alasan yang diberitahukan google kepada kita.

Mertuarez
sumber
0

Tambahkan satu kasus saat menggunakan Fragmen atau Aktivitas melalui CustomView:

Saat Anda menggunakan CursorLoader untuk mengamati tampilan tertentu, ListView atau TextView dan ingin memperbarui nilai tampilannya setiap kali data ContentProvider Anda diperbarui di bagian belakang (kasus paling umum Anda memiliki layanan yang memperbarui database lokal Anda dengan mengumpulkan data dari database / cloud jarak jauh secara berkala )

macio.Jun
sumber
-2

Satu hal besar yang tidak disebutkan oleh semua komentar di atas adalah bahwa fragmen tetap tersimpan di memori meskipun Android mematikan aktivitas dan memulai ulang ketika Anda melakukan sesuatu seperti mengubah orientasi perangkat Anda. Hal ini dilakukan karena alasan performa, tetapi juga dapat menyebabkan hasil yang tidak diharapkan jika Anda mengharapkan fragmen dimusnahkan hanya untuk mengetahui bahwa fragmen tersebut dibuat ulang entah dari mana.

AndroidDev
sumber