Saya punya dua kelas. Pertama adalah aktivitas, kedua adalah fragmen di mana saya memiliki beberapa EditText
. Dalam aktivitas saya memiliki subclass dengan async-task dan dalam metode doInBackground
saya mendapatkan beberapa hasil, yang saya simpan ke variabel. Bagaimana saya bisa mengirim variabel ini dari subkelas "aktivitas saya" ke fragmen ini?
android
android-fragments
pengguna1302569
sumber
sumber
getArguments().getString(key)
Anda juga dapat mengakses data aktivitas dari fragmen:
Aktivitas:
Pecahan:
sumber
Bundle
kelas untuk menyampaikan informasi. Atau Anda bisa membuatgetMyData()
metode itu diwarisi dan diimplementasikan dari antarmuka danFragment
periksa apakah getActivity mengembalikaninstanceof
Antarmuka dionAttach()
.Saya telah menemukan banyak jawaban di sini @ stackoverflow.com tapi jelas ini adalah jawaban yang benar:
"Mengirim data dari aktivitas ke fragmen di android".
Aktivitas:
Pecahan:
Membaca nilai dalam fragmen
atau hanya
sumber
Jawaban ini mungkin sudah terlambat. tetapi ini akan bermanfaat bagi pembaca masa depan.
Saya punya beberapa kriteria. Saya telah memberi kode untuk memilih file dari maksud. dan file yang dipilih untuk diteruskan ke fragmen tertentu untuk proses lebih lanjut. Saya punya banyak fragmen yang memiliki fungsi memilih file. pada saat itu, setiap kali mengecek kondisi dan mendapatkan fragmen serta melewati nilainya cukup menjijikkan. jadi, saya telah memutuskan untuk melewatkan nilai menggunakan antarmuka.
Langkah 1: Buat antarmuka di Aktivitas Utama.
Langkah 2: Buat referensi SelectedBundle pada Aktivitas yang Sama
Langkah 3: buat Metode di Aktivitas yang Sama
Langkah 4: Perlu menginisialisasi referensi SelectedBundle yang semuanya membutuhkan fungsionalitas filepicker. Anda menempatkan kode ini pada
onCreateView(..)
metode fragmen AndaLangkah 5: Kasus saya, saya harus meneruskan gambar Uri dari HomeActivity ke fragmen. Jadi, saya menggunakan fungsionalitas ini pada metode onActivityResult.
onActivityResult dari MainActivity, meneruskan nilai ke fragmen menggunakan antarmuka.
Catatan: Kasing Anda mungkin berbeda. Anda dapat memanggilnya dari mana saja dari HomeActivity Anda.
Itu saja. Terapkan setiap fragmen yang Anda butuhkan di FragmentClass. Kamu hebat. sudah selesai. WOW...
sumber
Ide dasar menggunakan Fragmen (F) adalah untuk membuat komponen UI mandiri yang dapat digunakan kembali dalam aplikasi android. Fragmen-fragmen ini terkandung dalam aktivitas dan ada cara umum (terbaik) untuk menciptakan jalur jalur komunikasi dari A -> F dan FA, Ini adalah suatu keharusan untuk Berkomunikasi di antara FF melalui suatu Kegiatan karena dengan demikian hanya Fragmen-fragmen yang akan dipisahkan dan mandiri.
Jadi meneruskan data dari A -> F akan sama dengan yang dijelaskan oleh ρяσѕρєя K. Selain jawaban itu, Setelah membuat Fragmen di dalam Aktivitas, kita juga bisa meneruskan data ke metode pemanggilan fragmen dalam Fragmen.
Sebagai contoh:
sumber
Pendekatan terbaik dan nyaman adalah memanggil contoh fragmen dan mengirim data pada saat itu. setiap fragmen secara default memiliki metode instance
jadi Anda akan memanggil fragmen Anda dari aktivitas seperti ini:
* R.id.container adalah id dari FrameLayout saya
jadi di MyFragment.newInstance ("data1", "data2") Anda dapat mengirim data ke fragmen dan di fragmen Anda, Anda mendapatkan data ini di MyFragment newInstance (String param1, String param2)
dan kemudian dalam metode fragmen onCreate Anda akan mendapatkan data:
sumber
Saya ingin menambahkan untuk pemula bahwa perbedaan antara 2 jawaban yang paling banyak dipilih di sini diberikan oleh penggunaan fragmen yang berbeda.
Jika Anda menggunakan fragmen dalam kelas java di mana Anda memiliki data yang ingin Anda sampaikan, Anda bisa menerapkan jawaban pertama untuk meneruskan data:
Namun, jika Anda menggunakan misalnya kode default yang diberikan oleh Android Studio untuk fragmen tab, kode ini tidak akan berfungsi.
Ini tidak akan berfungsi bahkan jika Anda mengganti PlaceholderFragment default dengan FragmentClasses Anda, dan bahkan jika Anda memperbaiki FragmentPagerAdapter ke situasi baru menambahkan sebuah saklar untuk getItem () dan switch lain untuk getPageTitle () (seperti yang ditunjukkan di sini )
Peringatan: klip yang disebutkan di atas memiliki kesalahan kode, yang saya jelaskan nanti di sini, tetapi berguna untuk melihat bagaimana Anda beralih dari kode default ke kode yang dapat diedit untuk fragmen tab)! Sisa jawaban saya jauh lebih masuk akal jika Anda mempertimbangkan kelas java dan file xml dari klip itu (mewakili untuk penggunaan pertama fragmen tab dengan skenario pemula).
Alasan utama jawaban yang paling banyak dipilih dari halaman ini tidak akan berfungsi adalah bahwa dalam kode default untuk fragmen tab, fragmen tersebut digunakan di kelas java lain: FragmentPagerAdapter!
Jadi, untuk mengirim data, Anda tergoda untuk membuat bundel di MotherActivity dan meneruskannya di FragmentPagerAdapter, menggunakan jawaban no.2.
Hanya itu yang salah lagi. ( Mungkin Anda bisa melakukannya seperti itu, tetapi itu hanya komplikasi yang tidak benar-benar diperlukan ).
Cara yang benar / lebih mudah untuk melakukannya, saya pikir, adalah meneruskan data secara langsung ke fragmen yang dimaksud, menggunakan jawaban no.2. Ya, akan ada ikatan ketat antara Activity dan Fragment, TAPI, untuk fragmen tab, itu semacam yang diharapkan. Saya bahkan akan menyarankan Anda untuk membuat fragmen tab di dalam kelas java MotherActivity (sebagai subclass, karena mereka tidak akan pernah digunakan di luar MotherActivity) - mudah, cukup tambahkan di dalam kelas java MotherActivity sebanyak Fragmen yang Anda butuhkan seperti ini:
Jadi, untuk meneruskan data dari MotherActivity ke Fragmen seperti itu, Anda perlu membuat String / Bundel pribadi di atas onCreate dari aktivitas Ibu Anda - yang dapat Anda isi dengan data yang ingin Anda sampaikan ke fragmen, dan meneruskannya melalui metode yang dibuat setelah onCreate (di sini disebut getMyData ()).
Dan kemudian di kelas fragmen, Anda menggunakan getMyData:
Jika Anda memiliki kueri basis data, saya sarankan Anda melakukannya di MotherActivity (dan berikan hasilnya sebagai String / Integer yang dilampirkan pada kunci di dalam bundel seperti yang ditunjukkan di atas), seperti di dalam fragmen tab, sintaks Anda akan menjadi lebih kompleks (ini menjadi getActivity () misalnya, dan getIntent menjadi getActivity (). getIntent), tetapi Anda juga memiliki opsi untuk melakukan seperti yang Anda inginkan.
Saran saya untuk pemula adalah fokus pada langkah-langkah kecil. Pertama, dapatkan niat Anda untuk membuka aktivitas tab yang sangat sederhana, tanpa meneruskan data APA PUN. Apakah itu bekerja? Apakah itu membuka tab yang Anda harapkan? Jika tidak, mengapa?
Mulai dari itu, dan dengan menerapkan solusi seperti yang disajikan dalam klip ini , lihat apa yang hilang. Untuk klip tertentu itu, mainactivity.xml tidak pernah ditampilkan. Itu pasti akan membingungkan Anda. Tetapi jika Anda memperhatikan, Anda akan melihat bahwa misalnya konteks (alat: konteks) salah dalam file fragmen xml. Setiap fragmen XML harus mengarah ke kelas fragmen yang benar (atau subkelas menggunakan pemisah $).
Anda juga akan melihat bahwa di kelas utama aktivitas java Anda perlu menambahkan tabLayout.setupWithViewPager (mViewPager) - tepat setelah baris TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tanpa baris ini, tampilan Anda sebenarnya tidak tertaut ke file XML dari fragmen, tetapi hanya menampilkan file xml dari aktivitas utama.
Selain baris di kelas java aktivitas utama, dalam file XML aktivitas utama Anda perlu mengubah tab agar sesuai dengan situasi Anda (mis. Menambah atau menghapus TabItems). Jika Anda tidak memiliki tab dalam XML aktivitas utama, maka mungkin Anda tidak memilih jenis aktivitas yang benar ketika Anda membuatnya di tempat pertama (aktivitas baru - aktivitas tab).
Harap perhatikan bahwa dalam 3 paragraf terakhir saya berbicara tentang video! Jadi ketika saya mengatakan XML aktivitas utama, itu adalah XML aktivitas utama dalam video, yang dalam situasi Anda adalah file XML MotherActivity.
sumber
Jika Anda meneruskan referensi ke fragmen (subkelas beton) ke dalam tugas async, Anda kemudian dapat mengakses fragmen secara langsung.
Beberapa cara meneruskan referensi fragmen ke dalam tugas async:
class FooTask extends AsyncTask
), lalu serahkan fragmen Anda ke konstruktor.sumber
Terkadang Anda dapat menerima Intent dalam aktivitas Anda dan Anda harus meneruskan info tersebut ke fragmen kerja Anda.
Jawaban yang diberikan OK jika Anda perlu memulai fragmen tetapi jika masih berfungsi,
setArguments()
tidak terlalu berguna.Masalah lain terjadi jika informasi yang dikirimkan akan menyebabkan berinteraksi dengan UI Anda. Dalam hal ini Anda tidak dapat memanggil sesuatu seperti
myfragment.passData()
karena Android akan dengan cepat memberi tahu bahwa hanya utas yang membuat tampilan dapat berinteraksi dengannya.Jadi proposal saya adalah menggunakan penerima. Dengan begitu, Anda dapat mengirim data dari mana saja, termasuk aktivitas, tetapi pekerjaan akan dilakukan dalam konteks fragmen.
Dalam fragmen Anda
onCreate()
:Dalam aktivitas Anda:
sumber
Posting yang sangat lama, masih saya berani menambahkan sedikit penjelasan yang akan membantu saya.
Secara teknis Anda dapat secara langsung mengatur anggota jenis apa pun dalam fragmen dari aktivitas.
Jadi mengapa Bundle?
Alasannya sangat sederhana - Bundel menyediakan cara seragam untuk menangani:
- membuat / membuka fragmen
- konfigurasi ulang (rotasi layar) - cukup tambahkan bundel awal / yang diperbarui ke outState di onSaveInstanceState ()
- restorasi aplikasi setelah sampah dikumpulkan di latar belakang ( seperti dengan konfigurasi ulang).
Anda dapat (jika Anda suka eksperimen) membuat solusi dalam situasi sederhana tetapi pendekatan Bundle tidak melihat perbedaan antara satu fragmen dan seribu pada backstack - itu tetap sederhana dan mudah.
Itu sebabnya jawaban oleh @Elenasys adalah solusi paling elegan dan universal.
Dan itu sebabnya jawaban yang diberikan oleh @Martin memiliki jebakan
sumber
pendekatan yang lebih baik untuk mengirim data dari kelas aktivitas ke fragmen adalah melalui metode setter. Suka
dan dapatkan data ini dari kelas dengan mudah.
sumber
Dari
Activity
Anda mengirim data dengan Bundle sebagai:Dan dalam
Fragment
metode onCreateView dapatkan data:sumber
Jika suatu
activity
kebutuhan untukfragment
melakukan tindakan setelah inisialisasi, cara termudah adalah denganactivity
meminta metode padafragment
instance. Dalamfragment
, tambahkan metode:dan kemudian di
activity
, dapatkan akses kefragment
menggunakanfragment
pengelola dan panggilmethod
:dan kemudian
activity
dapat berkomunikasi langsung denganfragment
dengan memohon inimethod
.sumber
onCreateView
metode dalam fragmen. benar-benar membantuGunakan antarmuka berikut untuk berkomunikasi antara aktivitas dan fragmen
Atau gunakan mengikuti pendengar generik ini untuk komunikasi dua arah menggunakan antarmuka
metode pertunjukan fragmen
Anda dapat melemparkan konteks Anda ke
GenericConnector
dalamonAttach(Context)
terlaludalam aktivitas Anda
dalam fragmen Anda
Catatan: Jangan pernah gunakan seperti itu
"".toString().toString().toString();
.sumber
baru saja menemukan pertanyaan ini, sementara sebagian besar metode di atas akan berhasil. Saya hanya ingin menambahkan bahwa Anda dapat menggunakan Perpustakaan Event Bus , terutama dalam skenario di mana komponen (Aktivitas atau Fragmen) belum dibuat, bagus untuk semua ukuran proyek android dan banyak kasus penggunaan. Saya pribadi menggunakannya di beberapa proyek yang saya miliki di playstore.
sumber
Anda dapat membuat metode statis publik dalam fragmen di mana Anda akan mendapatkan referensi statis fragmen itu dan kemudian meneruskan data ke fungsi itu dan mengatur data itu ke argumen dalam metode yang sama dan mendapatkan data melalui getArgument pada metode fragmen oncreate, dan mengatur data tersebut ke lokal variabel.
sumber
Cara yang paling dicoba dan teruji untuk mengirimkan data antara fragmen dan aktivitas adalah dengan membuat variabel, misalnya:
Kemudian untuk meneruskan data dari fragmen ke aktivitas, kami melakukannya dalam metode onActivityCreated:
Sekarang Anda bisa mendapatkan nilai dari StorageUtil.employees dari mana saja. Semoga berhasil!
sumber
Solusi saya adalah menulis metode statis di dalam fragmen:
Dengan cara ini saya yakin bahwa semua data yang saya butuhkan ada di dalam Fragmen sebelum operasi lain yang mungkin perlu dilakukan. Juga terlihat lebih bersih menurut saya.
sumber
Saya mengalami masalah serupa saat menggunakan komponen arsitektur Navigasi terbaru. Mencoba semua kode yang disebutkan di atas dengan meneruskan bundel dari aktivitas pemanggilan saya ke Fragment.
Solusi terbaik, mengikuti tren perkembangan terbaru di Android, adalah dengan menggunakan View Model (bagian dari Android Jetpack).
Membuat dan Menginisialisasi kelas ViewModel dalam Aktivitas induk, Harap perhatikan bahwa ViewModel ini harus dibagi antara aktivitas dan fragmen.
Sekarang, Di dalam onViewCreated () dari fragmen, Inisialisasi ViewModel yang Sama dan setup Pengamat untuk mendengarkan bidang ViewModel.
Berikut ini adalah tutorial yang bermanfaat dan mendalam jika Anda membutuhkannya.
https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c
sumber
Dalam aktivitas Anda deklarasikan variabel statis
Maka dalam fragmen Anda lakukan suka ikuti
sumber