Apa arti addToBackStack dengan parameter null?

97

Saya memiliki kode pelanggan. Hanya ada satu aktivitas untuk semua fragmen, yaitu aktivitas tunggal mengelola semua fragmen.

Aktivitas ini berisi kode berikut untuk setiap fragmen di akhir metode fragmen itu-

Misalnya - fragmen MoreFragment:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

Begitu,

1) Apa artinya addToBackStack(null)diikuti dengan a commit()?

2) Mengapa Anda perlu meneruskan parameter null ke addToBackStack?

3) Bagaimana cara mendapatkan fragmen itu setelah ditambahkan seperti ini?

Sepertinya kode ini tidak berguna karena saya menjalankan kode tanpa baris terakhir .addToBackStack(null).commit()dan berjalan tanpa masalah.

Tuhanku
sumber
developer.android.com/reference/android/app/… dalam beberapa kasus, Anda harus memanggil metode itu.
Lucifer
3
Anda bisa meneruskan nama fragmen sebagai parameter ke addToBackStack (name), bukan Null. Jika Anda meneruskan Null maka Anda tidak akan bisa menggunakan metode FragmentManager.popBackStackImmediate (String name, int flags); atau popBackStack (String name, int flags); karena namanya Null. Jadi metode popBackstack tidak akan berfungsi. Saya sarankan Anda meneruskan nama Fragmen sebagai parameter alih-alih meneruskan null.
luckylukein

Jawaban:

114

Apa arti addToBackStack (null) diikuti oleh komit ()?

Mengutip dokumen:

Dengan memanggil addToBackStack (), transaksi penggantian disimpan ke back-stack sehingga pengguna dapat membalikkan transaksi dan mengembalikan fragmen sebelumnya dengan menekan tombol Kembali.

Jika Anda menambahkan beberapa perubahan ke transaksi (seperti add () atau remove ()) dan memanggil addToBackStack (), semua perubahan yang diterapkan sebelum Anda memanggil commit () akan ditambahkan ke back-stack sebagai transaksi tunggal dan tombol Kembali akan membalikkan semuanya.

Urutan Anda menambahkan perubahan ke FragmentTransaction tidak penting, kecuali:

Anda harus menelepon commit()terakhir. Jika Anda menambahkan beberapa fragmen ke penampung yang sama, maka urutan Anda menambahkannya menentukan urutan kemunculannya dalam hierarki tampilan.

Jadi, Anda harus berkomitmen pada akhirnya.

Mengapa Anda perlu meneruskan parameter null ke addToBackStack?

Tidak perlu nol, ini bisa berupa string. Jika Anda tidak mau, berikan null.

public abstract FragmentTransaction addToBackStack (nama string)

Ditambahkan dalam API level 11 Tambahkan transaksi ini ke back-stack. Ini berarti bahwa transaksi akan diingat setelah dilakukan, dan akan membalik operasinya ketika nanti muncul dari tumpukan.

Nama parameter Nama opsional untuk status back-stack ini, atau null.

Tentang:

Sepertinya kode ini tidak berguna karena saya menjalankan kode tanpa baris terakhir .addToBackStack (null) .commit () dan berjalan tanpa masalah

Jika Anda ingin menavigasi ke fragmen sebelumnya, tambahkan ke backstack. Jadi itu tergantung pada apakah Anda ingin menambahkan fragmen ke backstack.

Bagaimana cara mendapatkan fragmen itu setelah ditambahkan seperti ini?

Anda sudah memiliki instance fragmen firstFragment. Jadi saya tidak tahu apa yang Anda maksud dengan mendapatkan fragmen nanti.

Informasi lebih lanjut @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)

Raghunandan
sumber
Anda juga dapat menambahkan ini ke jawaban Anda dari dokumen API: Tambahkan transaksi ini ke tumpukan belakang. Ini berarti bahwa transaksi akan diingat setelah dilakukan, dan akan membalik operasinya ketika nanti muncul dari tumpukan. Nama parameter Nama opsional untuk status back-stack ini, atau null.
Dyrborg
Jadi seperti yang saya pahami, seluruh tujuan penambahan backstack adalah untuk melakukan navigasi seperti yang kita lakukan dengan tombol kembali untuk menuju ke fragmen sebelumnya?
Ya Tuhan
ok jadi jika Anda mengirimkan parameter ke addToBackStack lalu mengapa kita perlu melakukannya getFragmentManager().popBackStackImmediate()jika tombol back dapat melakukannya sendiri dengan / tanpa parameter pass? Lihat jawaban dari - stackoverflow.com/questions/21156153/…
Ya Tuhan
@VedPrakash Anda tidak perlu memiliki. Juga itu adalah pertanyaan dan jawaban yang berbeda sama sekali. Anda dapat dengan mudah mengetahuinya sendiri dengan memiliki dua fragmen yang menambahkannya ke back-stack dan menekan tombol kembali
Raghunandan
@VedPrakash baca mengelola fragmen @ developer.android.com/guide/components/fragments.html
Raghunandan
17

The tagstring dalam addToBackStack(String name)memberikan cara untuk menemukan tumpukan kembali untuk kemudian pop langsung ke lokasi tersebut. Ini dimaksudkan untuk digunakan dalam metode popToBackStack(String name, int flags):

Munculkan transisi fragmen terakhir dari tumpukan belakang fragmen pengelola. Fungsi ini asynchronous - ini mengantrekan permintaan untuk muncul, tetapi tindakan tidak akan dilakukan sampai aplikasi kembali ke loop event-nya.

name: Jika bukan null, ini adalah nama dari kondisi sebelumnya yang harus dicari; jika ditemukan, semua status hingga status tersebut akan dimunculkan. Bendera POP_BACK_STACK_INCLUSIVE dapat digunakan untuk mengontrol apakah status bernama itu sendiri muncul. Jika null, hanya status teratas yang dimunculkan.

bendera: 0 atau POP_BACK_STACK_INCLUSIVE.

Dengan kata lain, ini akan memunculkan back-stack Anda sampai menemukan fragmen yang ditambahkan oleh namein addToBackStack(String name).

Misalnya, jika Anda melakukan serangkaian penambahan atau penggantian ke pengelola fragmen dengan memberikan nama "frag1", "frag2", "frag3", "frag4" dan kemudian ingin kembali langsung ke fragmen 2 yang ditambahkan dengan addToBackStack (" frag2 "), panggil popToBackStack("frag2", 0).

Begitu,

  • Gunakan .addToBackStack("fragName"): jika Anda ingin nanti popToBackStack(String name, int flags)memunculkan lebih dari satu back-stack.

  • Gunakan .addToBackStack(null): Jika Anda tidak ingin nanti pop lebih dari satu back-stack, tapi masih ingin pop satu per satu. Lakukan ini bahkan jika Anda tidak akan memanggil popToBackStack () secara eksplisit, tetapi sebaliknya akan membiarkan implementasi default tekan kembali menangani back-stack.

  • Gunakan .disallowAddToBackStack(): Jika Anda tidak ingin menekan kembali atau memanggil popBackStack () secara eksplisit. Ini akan memastikan tidak ada bagian kode yang menggunakan .addToBackStack ().

Allan Veloso
sumber
1

Jawaban Anda tidak berlaku lagi. Jika Anda tidak ingin menambahkan fragmen ke back-stack, Anda harus menggunakan cuplikan kode di bawah ini:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

Di bawah ini Anda memiliki contoh lucu bagaimana menggunakannya:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);
Eliasz Kubala
sumber
6
Tidak digunakan lagi dimana? Saya tidak melihat apa pun di dokumentasi atau sumber FragmentTransaction.
Rup
3
Waspadalah, jika Anda disallowAddToBackStack, panggilan apa pun di masa mendatang ke addToBackStack akan memunculkan IllegalStateException. Jika addToBackStack sudah dipanggil, metode ini akan menampilkan IllegalStateException.
Kathir