Dalam aktivitas saya, saya menelepon aktivitas kedua dari aktivitas utama oleh startActivityForResult
. Dalam aktivitas kedua saya, ada beberapa metode yang menyelesaikan aktivitas ini (mungkin tanpa hasil), namun, hanya satu dari mereka yang mengembalikan hasilnya.
Misalnya, dari aktivitas utama, saya memanggil yang kedua. Dalam kegiatan ini, saya memeriksa beberapa fitur handset seperti apakah ia memiliki kamera. Jika tidak, maka saya akan menutup kegiatan ini. Juga, selama persiapan MediaRecorder
atau MediaPlayer
jika masalah terjadi maka saya akan menutup kegiatan ini.
Jika perangkatnya memiliki kamera dan perekaman selesai, maka setelah merekam video jika pengguna mengklik tombol selesai maka saya akan mengirim hasilnya (alamat video yang direkam) kembali ke aktivitas utama.
Bagaimana saya memeriksa hasil dari kegiatan utama?
Jawaban:
Dari
FirstActivity
panggilan Anda metodeSecondActivity
menggunakanstartActivityForResult()
Sebagai contoh:
Di
SecondActivity
set Anda , data yang ingin Anda kembalikanFirstActivity
. Jika Anda tidak ingin kembali, jangan atur apa pun.Misalnya: Di
SecondActivity
jika Anda ingin mengirim kembali data:Jika Anda tidak ingin mengembalikan data:
Sekarang di
FirstActivity
kelas Anda tulis kode berikut untukonActivityResult()
metode ini.Untuk menerapkan pengiriman data di antara dua aktivitas dengan cara yang jauh lebih baik di Kotlin, silakan kunjungi tautan ini ' Cara yang lebih baik untuk mengirimkan data di antara Aktivitas '
sumber
SecondActivity
beberapa pengecualian terjadi, dalam hal ini Anda juga harus mengembalikan hasilnya keFirstActivity
, sehingga Anda dapat mengatur hasilnya seperti"RESULT_CANCELLED"
di blok tangkap dan kembali keFirstActivty
dan diFirstActivity's' 'onActivityResult()
Anda dapat memeriksa apakah Anda mendapatkan hasil keberhasilan atau kegagalan.Anda perlu mengganti
Activity.onActivityResult()
lalu memeriksa parameternya:requestCode
mengidentifikasi aplikasi mana yang mengembalikan hasil ini. Ini ditentukan oleh Anda saat Anda meneleponstartActivityForResult()
.resultCode
memberi tahu Anda apakah aplikasi ini berhasil, gagal, atau sesuatu yang berbedadata
menyimpan informasi apa pun yang dikembalikan oleh aplikasi ini. Ini mungkinnull
.sumber
Melengkapi jawaban dari @ Nishant, cara terbaik untuk mengembalikan hasil aktivitas adalah:
Saya mengalami masalah dengan
Kemudian saya menemukan bahwa cara yang benar adalah menggunakan
untuk mendapatkan maksud saat ini
sumber
Intent
yang hanya ada untuk menampungBundle
dan tidak memiliki nilai normal seperti tindakan atau komponen. Tetapi juga terasa agak aneh (dan berpotensi berbahaya?) Untuk memodifikasiIntent
yang digunakan untuk meluncurkan aktivitas saat ini. Jadi saya mencari sumber untuk Android itu sendiri dan menemukan bahwa mereka selalu membuat yang baruIntent
untuk digunakan sebagai hasilnya. Misalnya, github.com/aosp-mirror/platform_frameworks_base/blob/…getIntent()
tampaknya menjadi cara sempurna untuk mengembalikan data ke aktivitas yang tidak dikenal, dari mana aktivitas tersebut dipanggil. Terima kasih!Contoh
Untuk melihat keseluruhan proses dalam konteks, berikut ini adalah jawaban tambahan. Lihat jawaban lengkap saya untuk penjelasan lebih lanjut.
MainActivity.java
SecondActivity.java
sumber
Bagi mereka yang memiliki masalah dengan requestCode yang salah di onActivityResult
Jika Anda menelepon
startActivityForResult()
dari AndaFragment
, requestCode diubah oleh Activity yang memiliki Fragment.Jika Anda ingin mendapatkan kode hasil yang benar dalam aktivitas Anda, coba ini:
Perubahan:
startActivityForResult(intent, 1);
Untuk:getActivity().startActivityForResult(intent, 1);
sumber
Jika Anda ingin memperbarui antarmuka pengguna dengan hasil aktivitas, Anda tidak dapat menggunakan
this.runOnUiThread(new Runnable() {}
Melakukan ini, UI tidak akan menyegarkan dengan nilai baru. Sebagai gantinya, Anda dapat melakukan ini:Ini terlihat konyol tetapi bekerja cukup baik.
sumber
Pertama Anda menggunakan
startActivityForResult()
dengan parameter di pertamaActivity
dan jika Anda ingin mengirim data dari keduaActivity
ke pertamaActivity
kemudian melewati nilai menggunakanIntent
dengansetResult()
metode dan mendapatkan data di dalamonActivityResult()
metode terlebih dahuluActivity
.sumber
Masalah yang sangat umum di android
Ini dapat dipecah menjadi 3 Buah
1) mulai Kegiatan B (Terjadi dalam Kegiatan A)
2) Tetapkan data yang diminta (Terjadi dalam kegiatan B)
3) Menerima data yang diminta (Terjadi dalam kegiatan A)
Di bagian ini, Anda memutuskan apakah Anda ingin mengirim kembali data atau tidak ketika peristiwa tertentu terjadi.
Misalnya: Dalam aktivitas B ada EditText dan dua tombol b1, b2.
Mengklik Tombol b1 mengirim data kembali ke aktivitas A
Mengklik Tombol b2 tidak mengirim data apa pun.
Mengirim data
Tidak mengirim data
pengguna mengklik tombol kembali
Secara default, hasilnya ditetapkan dengan kode respons Activity.RESULT_CANCEL
Untuk itu timpa metode onActivityResult
sumber
ActivityResultRegistry adalah pendekatan yang direkomendasikan
ComponentActivity
sekarang menyediakanActivityResultRegistry
yang memungkinkan Anda menanganistartActivityForResult()
+onActivityResult()
sertarequestPermissions()
+onRequestPermissionsResult()
mengalir tanpa mengesampingkan metode diActivity
atauFragment
, membawa peningkatan keamanan jenis melaluiActivityResultContract
, dan menyediakan kait untuk menguji aliran ini.Sangat disarankan untuk menggunakan API Hasil Aktivitas yang diperkenalkan di AndroidX Activity 1.2.0-alpha02 dan Fragment 1.3.0-alpha02.
Tambahkan ini ke
build.gradle
Bagaimana cara menggunakan kontrak pra-bangun?
API baru ini memiliki fungsionalitas pra dibangun berikut
Contoh yang menggunakan kontrak takePicture:
Jadi apa yang terjadi di sini? Mari kita memecahnya sedikit.
takePicture
hanyalah panggilan balik yang mengembalikan Bitmap yang dapat dibatalkan - apakah atau tidak itu null tergantung pada apakahonActivityResult
prosesnya berhasil atau tidak .prepareCall
kemudian daftarkan panggilan ini ke fitur baru yangComponentActivity
disebutActivityResultRegistry
- kami akan kembali ke sini nanti.ActivityResultContracts.TakePicture()
adalah salah satu pembantu bawaan yang dibuat Google untuk kami, dan akhirnya memohontakePicture
sebenarnya memicu Intent dengan cara yang sama seperti sebelumnyaActivity.startActivityForResult(intent, REQUEST_CODE)
.Bagaimana cara menulis kontrak khusus?
Kontrak sederhana yang menggunakan Int sebagai Input dan mengembalikan String yang meminta Aktivitas mengembalikan pada Intent hasil.
Periksa dokumentasi resmi ini untuk informasi lebih lanjut.
sumber
sumber