Saya memiliki dua kegiatan: aktivitas utama dan aktivitas anak.
Ketika saya menekan tombol di aktivitas utama, aktivitas anak diluncurkan.
Sekarang saya ingin mengirim beberapa data kembali ke layar utama. Saya menggunakan kelas Bundle, tetapi tidak berfungsi. Itu melempar beberapa pengecualian runtime.
Apakah ada solusi untuk ini?
android
android-intent
Rajapanda
sumber
sumber
Jawaban:
Ada beberapa cara untuk mencapai apa yang Anda inginkan, tergantung pada kondisinya.
Skenario yang paling umum (yang terdengar seperti milik Anda) adalah ketika Aktivitas anak digunakan untuk mendapatkan input pengguna - seperti memilih kontak dari daftar atau memasukkan data dalam kotak dialog. Dalam hal ini Anda harus menggunakannya
startActivityForResult
untuk meluncurkan Aktivitas anak Anda.Ini menyediakan jalur pipa untuk mengirim data kembali ke Aktivitas utama menggunakan
setResult
. Metode setResult mengambil nilai hasil int dan Intent yang dikembalikan ke Activity calling.Untuk mengakses data yang dikembalikan dalam penggantian Aktivitas panggilan
onActivityResult
. RequestCode sesuai dengan bilangan bulat yang diteruskan dalamstartActivityForResult
panggilan, sedangkan resultCode dan Intent data dikembalikan dari Activity anak.sumber
startActivityForResult
fungsi alih-alih hanyastartActivity
. Contoh mungkin distartActivityForResult(myIntent, 2);
mana 2 adalah kode hasil, yang dapat menggantikanMY_CHILD_ACTIVITY
dalam pernyataan switch di atas.Aktivitas 1 menggunakan startActivityForResult :
Kegiatan 2 diluncurkan dan Anda dapat melakukan operasi, untuk menutup Kegiatan lakukan ini:
Aktivitas 1 - kembali dari aktivitas sebelumnya akan memanggil onActivityResult :
UPDATE: Jawaban untuk komentar Seenu69, Dalam aktivitas dua,
Kemudian dalam aktivitas satu,
sumber
Mengirim Kembali Data
Ini membantu saya melihat berbagai hal dalam konteks. Ini adalah proyek sederhana lengkap untuk mengirim data kembali. Alih-alih menyediakan file tata letak xml, ini adalah gambar.
Aktifitas utama
startActivityForResult
, berikan kode hasil yang sewenang-wenang.onActivityResult
. Ini disebut ketika Aktivitas Kedua selesai. Anda dapat memastikan bahwa itu sebenarnya Aktivitas Kedua dengan memeriksa kode permintaan. (Ini berguna ketika Anda memulai beberapa aktivitas berbeda dari aktivitas utama yang sama.)Intent
. Data diekstraksi menggunakan pasangan kunci-nilai.MainActivity.java
Aktivitas kedua
Intent
. Data disimpan dalamIntent
pasangan kunci-nilai.RESULT_OK
dan tambahkan maksud menyimpan data Anda.finish()
untuk menutup Aktivitas Kedua.SecondActivity.java
Catatan lain
RESULT_OK
. Hanya menggunakan nama lengkap:Activity.RESULT_OK
.Lihat juga
sumber
FirstActivity menggunakan startActivityForResult:
Pada panggilan SecondActivity setResult () onClick events atau onBackPressed ()
sumber
Panggil Intensi aktivitas anak menggunakan pemanggilan metode startActivityForResult ()
Ada contohnya di sini: http://developer.android.com/training/notepad/notepad-ex2.html
dan di "Mengembalikan Hasil dari Layar" ini: http://developer.android.com/guide/faq/commontasks.html#opennewscreen
sumber
Saya telah membuat kelas demo sederhana untuk referensi Anda yang lebih baik.
sumber
Pada aktivitas pertama, Anda dapat mengirim maksud menggunakan
startActivityForResult()
dan kemudian mendapatkan hasil dari aktivitas kedua setelah selesai digunakansetResult
.MainActivity.class
Kelas II
sumber
Semua jawaban ini menjelaskan skenario aktivitas kedua Anda harus selesai setelah mengirim data.
Tetapi jika Anda tidak ingin menyelesaikan aktivitas kedua dan ingin mengirim data kembali ke pertama maka untuk itu Anda dapat menggunakan BroadCastReceiver.
Dalam Aktivitas Kedua -
Dalam Aktivitas Pertama -
Daftarkan penerima di onCreate () -
Batalkan registrasi di onDestroy ()
sumber
Cara lain untuk mencapai hasil yang diinginkan yang mungkin lebih baik tergantung pada situasi Anda adalah membuat antarmuka pendengar.
Dengan membuat aktivitas orang tua mendengarkan antarmuka yang dipicu oleh aktivitas anak sambil meneruskan data yang diperlukan sebagai parameter dapat membuat seperangkat keadaan yang serupa
sumber
Ada beberapa cara untuk melakukan ini. 1. dengan menggunakan startActivityForResult () yang dijelaskan dengan sangat baik dalam jawaban di atas.
dengan membuat variabel statis di kelas "Utils" Anda atau kelas lain Anda sendiri. Misalnya saya ingin meneruskan studentId dari ActivityB ke ActivityA.First pertama ActivityA saya memanggil ActivityB. Kemudian di dalam ActivityB atur studentId (yang merupakan bidang statis di Utils.class). Suka Utils.STUDENT_ID = "1234" ini; kemudian saat kembali ke ActivityA gunakan studentId yang disimpan di Utils.STUDENT_ID.
dengan membuat metode pengambil dan penyetel di Kelas Aplikasi Anda.
seperti ini:
jadi kamu sudah selesai. cukup atur data di dalamnya ketika Anda berada di ActivityB dan setelah kembali ke ActivityA, dapatkan datanya.
sumber
Hanya detail kecil yang menurut saya tidak ada dalam jawaban di atas.
Jika aktivitas anak Anda dapat dibuka dari beberapa aktivitas orang tua, maka Anda dapat memeriksa apakah Anda perlu melakukannya
setResult
atau tidak, berdasarkan apakah aktivitas Anda dibuka olehstartActivity
ataustartActivityForResult
. Anda dapat mencapai ini dengan menggunakangetCallingActivity()
. Info lebih lanjut di sini .sumber
Gunakan SharedPreferences dan simpan data Anda dan akses dari mana saja di aplikasi
simpan tanggal seperti ini
Dan terima data seperti ini
sumber