Saya menggunakan DialogFragments untuk sejumlah hal: memilih item dari daftar, memasukkan teks.
Apa cara terbaik untuk mengembalikan nilai (yaitu string atau item dari daftar) kembali ke aktivitas / fragmen panggilan?
Saat ini saya membuat implementasi aktivitas panggilan DismissListener
dan memberikan DialogFragment referensi ke aktivitas tersebut. Dialog kemudian memanggil OnDimiss
metode dalam aktivitas dan aktivitas mengambil hasil dari objek DialogFragment. Sangat berantakan dan tidak berfungsi pada perubahan konfigurasi (perubahan orientasi) karena DialogFragment kehilangan referensi ke aktivitas.
Terima kasih atas bantuannya.
Activity
danDialogFragment
mungkin dibuat ulang. Menggunakan yangActivity
diteruskan keonAttach(Activity activity)
adalah cara yang tepat dan direkomendasikan.Jawaban:
Gunakan
myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE)
dari tempat di mana Anda menampilkan dialog, dan kemudian ketika dialog Anda selesai, dari situ Anda bisa menelepongetTargetFragment().onActivityResult(getTargetRequestCode(), ...)
, dan mengimplementasikannyaonActivityResult()
dalam fragmen yang berisi.Sepertinya penyalahgunaan
onActivityResult()
, terutama karena tidak melibatkan kegiatan sama sekali. Tapi saya sudah melihatnya direkomendasikan oleh orang-orang google resmi, dan mungkin bahkan dalam demo api. Saya pikir itu untuk apag/setTargetFragment()
ditambahkan.sumber
Seperti yang Anda lihat di sini ada cara yang sangat sederhana untuk melakukannya.
Di
DialogFragment
add Anda tambahkan pendengar antarmuka seperti:Kemudian, tambahkan referensi ke pendengar itu:
Ini akan digunakan untuk "mengaktifkan" metode pendengar, dan juga untuk memeriksa apakah Activity / Fragment induk mengimplementasikan antarmuka ini (lihat di bawah).
Di
Activity
/FragmentActivity
/Fragment
yang "disebut" ituDialogFragment
hanya mengimplementasikan antarmuka ini.Dalam
DialogFragment
semua yang Anda butuhkan untuk menambahkan pada titik di mana Anda ingin mengabaikanDialogFragment
dan mengembalikan hasilnya adalah ini:Dimana
mEditText.getText().toString()
apa yang akan diteruskan kembali ke pemanggilanActivity
.Perhatikan bahwa jika Anda ingin mengembalikan sesuatu yang lain, cukup ubah argumen yang diambil pendengar.
Terakhir, Anda harus memeriksa apakah antarmuka benar-benar diimplementasikan oleh aktivitas / fragmen induk:
Teknik ini sangat fleksibel dan memungkinkan menelepon kembali dengan hasil bahkan jika Anda belum mau mengabaikan dialog.
sumber
Activity
'danFragmentActivity
' tetapi jika penelepon ituFragment
?Fragment
.Fragment
maka Anda dapat melakukan beberapa hal: 1. Lewati fragmen sebagai referensi (Mungkin bukan ide yang baik karena Anda dapat menyebabkan kebocoran memori). 2. GunakanFragmentManager
dan panggilfindFragmentById
ataufindFragmentByTag
akan mendapatkan fragmen yang ada di aktivitas Anda. Saya harap ini membantu. Semoga hari mu menyenangkan!setTargetFragment()
dangetTargetFragment()
ajaib.Ada cara yang lebih sederhana untuk menerima hasil dari DialogFragment.
Pertama, di Activity, Fragment, atau FragmentActivity Anda perlu menambahkan informasi berikut:
Pada
requestCode
dasarnya ini adalah label int Anda untuk DialogFragment yang Anda panggil, saya akan menunjukkan cara kerjanya dalam sedetik. ResultCode adalah kode yang Anda kirim kembali dari DialogFragment yang memberi tahu Aktivitas, Fragmen, atau FragmentActivity Anda saat ini tentang apa yang terjadi.Sepotong kode berikutnya untuk masuk adalah panggilan ke DialogFragment. Contohnya ada di sini:
Dengan tiga baris ini Anda mendeklarasikan DialogFragment Anda, menetapkan requestCode (yang akan memanggil onActivityResult (...) setelah Dialog diberhentikan, dan Anda kemudian menampilkan dialog. Sesederhana itu.
Sekarang, di DialogFragment Anda, Anda hanya perlu menambahkan satu baris langsung sebelum
dismiss()
sehingga Anda mengirim resultCode kembali ke onActivityResult ().Itu dia. Catatan, resultCode didefinisikan seperti
int resultCode
yang saya aturresultCode = 1;
dalam hal ini.Itu saja, Anda sekarang dapat mengirim hasil DialogFragment Anda kembali ke Aktivitas panggilan Anda, Fragmen, atau FragmentActivity.
Juga, sepertinya informasi ini telah diposting sebelumnya, tetapi tidak ada contoh yang cukup diberikan jadi saya pikir saya akan memberikan lebih banyak detail.
EDIT 06.24.2016 Saya minta maaf atas kode yang menyesatkan di atas. Tetapi Anda pasti tidak dapat menerima hasilnya kembali ke aktivitas dengan melihat sebagai baris:
menetapkan target
Fragment
dan tidakActivity
. Jadi untuk melakukan ini, Anda perlu menggunakan implementInterfaceCommunicator
.Di
DialogFragment
set Anda, variabel globalBuat fungsi publik untuk menanganinya
Kemudian ketika Anda siap untuk mengirim kode kembali ke
Activity
ketikaDialogFragment
dilakukan berjalan, Anda cukup menambahkan baris sebelum Andadismiss();
AndaDialogFragment
:Dalam aktivitas Anda sekarang Anda harus melakukan dua hal, yang pertama adalah menghapus satu baris kode yang tidak lagi berlaku:
Kemudian implementasikan antarmuka dan Anda semua selesai. Anda dapat melakukannya dengan menambahkan baris berikut ke
implements
klausa di bagian paling atas kelas Anda:Dan kemudian
@Override
fungsi dalam aktivitas tersebut,Anda menggunakan metode antarmuka ini sama seperti
onActivityResult()
metode Anda. Kecuali metode antarmuka untukDialogFragments
dan yang lainnya adalah untukFragments
.sumber
dialogFrag.setTargetFragment(this, 1)
dari suatu Kegiatan, tetapi metode ini menerima Fragmen sebagai argumen pertama, jadi ini tidak dapat dicor. Apakah saya benar ?@Override public void onAttach(Context context) { super.onAttach(context); yourInterface = (YourInterface) context; }
Yah mungkin sudah terlambat untuk menjawab tetapi di sini adalah apa yang saya lakukan untuk mendapatkan kembali dari
DialogFragment
. sangat mirip dengan jawaban @ brandon. Di sini saya meneleponDialogFragment
dari sebuah fragmen, cukup tempatkan kode ini di mana Anda memanggil dialog Anda.di mana
categoryDialog
sayaDialogFragment
yang ingin saya panggil dan setelah ini dalam implementasi Andadialogfragment
tempat kode ini di mana Anda mengatur data Anda dalam niat. NilairesultCode
1 adalah Anda dapat mengaturnya atau menggunakan sistem Didefinisikan.sekarang saatnya untuk kembali ke fragmen panggilan dan mengimplementasikan metode ini. memeriksa validitas data atau hasil yang sukses jika Anda ingin dengan
resultCode
danrequestCode
dalam kondisi jika.sumber
Pendekatan berbeda, untuk memungkinkan Fragmen berkomunikasi hingga Aktivitasnya :
1) Tentukan antarmuka publik dalam fragmen dan buat variabel untuknya
2) Keluarkan aktivitas ke variabel mCallback dalam fragmen
3) Laksanakan pendengar dalam aktivitas Anda
4) Mengesampingkan OnFragmentInteraction dalam aktivitas
Info lebih lanjut tentang itu: https://developer.android.com/training/basics/fragments/communicating.html
sumber
public void onAttach
fragmen dan melakukan casting aktivitas di sanaSatu cara mudah yang saya temukan adalah yang berikut: Terapkan ini adalah dialogFragment Anda,
Dan kemudian dalam aktivitas yang disebut Dialog Fragment membuat fungsi yang sesuai seperti:
The Toast adalah untuk menunjukkan bahwa ia berfungsi. Bekerja untukku.
sumber
Interface
lebih baik daripada hard-coupling dengan kelas beton.Saya sangat terkejut melihat bahwa tidak ada seorang pun telah menyarankan menggunakan siaran lokal untuk
DialogFragment
untukActivity
komunikasi! Saya merasa itu jauh lebih sederhana dan lebih bersih daripada saran lainnya. Pada dasarnya, Anda mendaftar untukActivity
mendengarkan siaran dan Anda mengirim siaran lokal dari mesinDialogFragment
virtual Anda . Sederhana. Untuk panduan langkah demi langkah tentang cara mengatur semuanya, lihat di sini .sumber
Atau bagikan ViewModel seperti yang diperlihatkan di sini:
https://developer.android.com/topic/libraries/architecture/viewmodel#sharing_data_between_fragments
sumber
Dalam kasus saya, saya perlu meneruskan argumen ke targetFragment. Tapi saya mendapat pengecualian "Fragmen sudah aktif". Jadi saya mendeklarasikan sebuah Antarmuka di DialogFragment saya yang diimplementasikan parentFragment. Ketika parentFragment memulai DialogFragment, itu menetapkan dirinya sebagai TargetFragment. Kemudian di DialogFragment saya menelepon
sumber
Di Kotlin
// Aktivitas Saya
Saya harap ini berfungsi, jika Anda dapat meningkatkan, silakan edit. Bahasa Inggris saya tidak begitu bagus
sumber
jika Anda ingin mengirim argumen dan menerima hasil dari fragmen kedua, Anda dapat menggunakan Fragment.setArguments untuk menyelesaikan tugas ini
sumber
Hanya untuk memilikinya sebagai salah satu opsi (karena belum ada yang menyebutkannya) - Anda dapat menggunakan bus acara seperti Otto. Jadi dalam dialog yang Anda lakukan:
Dan mintalah penelepon Anda (Aktivitas atau Fragmen) untuk berlangganan:
sumber