Aktivitas yang menampung fragmen ini memiliki onActivityResult
disebut ketika aktivitas kamera kembali.
Fragmen saya memulai aktivitas untuk hasil dengan maksud yang dikirim agar kamera mengambil gambar. Aplikasi gambar dimuat dengan baik, mengambil gambar, dan kembali. The onActivityResult
namun tidak pernah memukul. Saya telah menetapkan breakpoint, tetapi tidak ada yang dipicu. Bisakah sebuah fragmen punya onActivityResult
? Saya pikir begitu karena ini adalah fungsi yang disediakan. Mengapa ini tidak dipicu?
ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1888);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( requestCode == 1888 ) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
}
}
requestCode >= 0
!Jawaban:
Aktivitas hosting ditimpa
onActivityResult()
, tetapi tidak membuat panggilan kesuper.onActivityResult()
untuk kode hasil tidak tertangani. Rupanya, meskipun fragmen adalah yang membuatstartActivityForResult()
panggilan, aktivitas tersebut mendapat kesempatan pertama untuk menangani hasilnya. Ini masuk akal ketika Anda mempertimbangkan modularitas fragmen. Setelah saya laksanakansuper.onActivityResult()
untuk semua hasil yang tidak tertangani, fragmen mencoba menangani hasil.Dan juga dari jawaban @siqing:
Untuk mendapatkan hasil dalam fragmen Anda, pastikan Anda menelepon
startActivityForResult(intent,111);
alih-alihgetActivity().startActivityForResult(intent,111);
di dalam fragmen Anda.sumber
getParentFragment().startActivityForResult
sehingga fragmen induk akan memanggil metode onActivityResult.Saya pikir Anda menelepon
getActivity().startActivityForResult(intent,111);
. Anda harus meneleponstartActivityForResult(intent,111);
.sumber
RingtonePreference
terletak diPreferenceFragment
. Sayangnya,RingtonePreference
panggilangetActivity().startActivityForResult()
, dan saya tidak mendapatkan hasil meskipun saya memanggilsuper.onActivityResult
aktivitasonActivityResult
. Saya terpaksa membuat turunan dariRingtonePreference
kelas, yang mengikat dirinya kePreferenceFragment
dan panggilanfragment.startActivityForResult()
.Pilihan 1:
Jika Anda menelepon
startActivityForResult()
dari fragmen maka Anda harus meneleponstartActivityForResult()
, bukangetActivity().startActivityForResult()
, karena akan menghasilkan fragmen padaActivityResult ().Jika Anda tidak yakin di mana Anda menelepon
startActivityForResult()
dan bagaimana Anda akan memanggil metode.Pilihan 2:
Karena Aktivitas mendapatkan hasil
onActivityResult()
, Anda perlu mengganti aktivitasonActivityResult()
dan panggilansuper.onActivityResult()
untuk menyebar ke masing-masing fragmen untuk kode hasil yang tidak ditangani atau untuk semua.Jika dua opsi di atas tidak bekerja, maka merujuk ke opsi 3 karena pasti akan berhasil.
Opsi 3:
Panggilan eksplisit dari fragmen ke fungsi onActivityResult adalah sebagai berikut.
Di kelas induk Aktivitas, menimpa metode onActivityResult () dan bahkan menimpa yang sama di kelas Fragmen dan panggilan sebagai kode berikut.
Di kelas induk:
Di kelas anak:
sumber
setResult(); finish();
ketika saya menekan kembali dari aktivitas kedua kemudianonActivityResult
dipanggil juga dengan ketentuanRESULT_CODE
.onActivityResult()
aktivitas mengembalikan anehrequestCode
yang diteruskan ke fragmen saya dan kemudian diabaikan = /Jika Anda tidak tahu fragmen dalam aktivitas Anda, sebutkan saja semuanya dan kirim argumen hasil aktivitas:
sumber
Saya mengalami masalah yang sama dengan
ChildFragmentManager
. Manajer tidak akan meneruskan hasilnya ke fragmen bersarang, Anda harus melakukannya secara manual di fragmen dasar Anda.sumber
Fragment fragment = myChildFragment;
untuk menggantifindFragmentByTag
baris kode di atas. Sisanya bisa tidak berubah.Pos asli.
FragmentActivity
digantirequestCode
dengan yang dimodifikasi. Setelah itu, ketikaonActivityResult()
akan dipanggil,FragmentActivity
parsing 16 bit yang lebih tinggi dan mengembalikan indeks Fragmen asli. Lihatlah skema ini:Jika Anda memiliki beberapa fragmen di level root, tidak ada masalah. Tetapi jika Anda memiliki fragmen bersarang , misalnya
Fragment
dengan beberapa tab di dalamnyaViewPager
, Anda dijamin akan menghadapi masalah (atau sudah dihadapkan).Karena hanya satu indeks yang disimpan di dalam
requestCode
. Itulah indeksFragment
di dalamnyaFragmentManager
. Ketika kami menggunakan fragmen bersarang, ada anak-anakFragmentManager
, yang memiliki daftar Fragmen mereka sendiri. Jadi, penting untuk menyimpan seluruh rantai indeks, mulai dari rootFragmentManager
.Bagaimana kita mengatasi masalah ini? Ada solusi penyelesaian umum dalam posting ini .
GitHub: https://github.com/shamanland/nested-fragment-issue
sumber
Ini adalah salah satu masalah paling populer. Kami dapat menemukan banyak utas tentang masalah ini. Tetapi tidak satupun dari mereka yang berguna bagiKU.
Jadi saya telah memecahkan masalah ini menggunakan solusi ini.
Pertama mari kita pahami mengapa ini terjadi.
Kita dapat memanggil
startActivityForResult
langsung dari Fragment tetapi sebenarnya mekanik di belakang semuanya ditangani oleh Activity.Begitu Anda menelepon
startActivityForResult
dari Fragmen, requestCode akan diubah untuk melampirkan identitas Fragmen ke kode. Dengan begitu, Activity dapat melacak kembali siapa yang mengirim permintaan ini begitu hasilnya diterima.Setelah Aktivitas dinavigasi kembali, hasilnya akan dikirim ke onActivityResult Activity dengan kode request yang dimodifikasi yang akan diterjemahkan ke kode requestCode asli + identitas Fragmen. Setelah itu, Aktivitas akan mengirimkan Hasil Aktivitas ke Fragmen itu melalui onActivityResult. Dan semuanya sudah selesai.
Masalahnya adalah:
Aktivitas dapat mengirim hasilnya hanya ke Fragmen yang telah dilampirkan langsung ke Aktivitas tetapi bukan yang bersarang. Itulah alasan mengapa onActivityResult fragmen bersarang tidak akan pernah dipanggil apa pun yang terjadi.
Larutan:
1) Mulai Intent di Fragmen Anda dengan kode di bawah ini:
2) Sekarang di Override Activity Induk Anda **
onActivityResult()
: **Anda harus memanggil ini dalam aktivitas induk untuk membuatnya berfungsi.
3) Dalam panggilan fragmen Anda:
Itu dia. Dengan solusi ini, itu bisa diterapkan untuk setiap fragmen apakah itu bersarang atau tidak. Dan ya, itu juga mencakup semua kasing! Apalagi kodenya juga bagus dan bersih.
sumber
UNTUK BANYAK TEMPAT YANG DIBERI BANYAK (misalnya, ketika menggunakan ViewPager dalam sebuah fragmen)
Dalam aktivitas utama Anda :
Dalam fragmen Anda:
Di fragmen bersarang Anda
Aktivitas panggilan
unikInstanceInt - ganti dengan int yang unik di antara fragmen bersarang untuk mencegah fragmen lain memperlakukan jawabannya.
Terima respons
Perhatian
Angka antara 0 dan 65536 perlu digunakan dalam uniqueInstanceInt untuk menghindari kesalahan "Hanya dapat menggunakan 16 bit lebih rendah untuk requestCode".
sumber
Saya dapat menambahkan dua saran jika seseorang masih tidak bisa datang. Dalam file Manifest.xml, pastikan aktivitas hosting tidak selesai ketika dipanggil kembali dan aktivitas yang akan dimulai memiliki mode peluncuran sebagai standar. Lihat detailnya seperti di bawah ini:
Untuk aktivitas Hosting, tetapkan properti no history sebagai false jika ada
Agar Aktivitas dimulai, setel mode peluncuran sebagai standar jika ada
sumber
Saya juga menghadapi masalah yang sama begitu saya menggeser blok kode ini di luar Fragmen ke Kelas Utilitas , dengan
parentActivity
diteruskan sebagai argumen ,Kemudian saya tidak mendapatkan nilai apa pun dalam
onActivityResult
metode Fragmen itu, Setelah itu, saya mengubah argumen menjadi Fragmen , sehingga definisi metode yang direvisi tampak seperti,Setelah itu, saya bisa mendapatkan nilai
onActivityResult
pada Fragmensumber
Saya juga menemui masalah ini dalam Fragmen. Dan aku menelepon
startActivityForResult
dalamDialogFragment
.Tapi sekarang masalah ini telah diselesaikan:
FragmentClassname.this.startActivityForResult
.sumber
startActivityForResult(...)
dari kelas abstrak di dalam kode fragmen.UNTUK FRAGMENT YANG DIBERIKAN (misalnya, saat menggunakan ViewPager)
Dalam aktivitas utama Anda:
Di fragmen tingkat atas utama Anda (fragmen ViewPager):
Di YourFragment (fragmen bersarang):
sumber
Dalam kasus saya itu adalah bug Android ( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/ ), jika Anda menggunakan dukungan,
FragmentActivity
Anda harus menggunakangetSupportFragmentManager
alih-alihgetChildFragmentManager
:sumber
Pendeknya,
Dalam fragmen, nyatakan
Fragment fragment = this
;setelah itu gunakan
fragment.startActivityForResult
.Hasilnya akan kembali di activityResult.
sumber
Solusi 1:
Panggil
startActivityForResult(intent, REQUEST_CODE);
alih-alihgetActivity().startActivityForResult(intent, REQUEST_CODE);
.Solusi 2:
Kapan
startActivityForResult(intent, REQUEST_CODE);
aktivitasonActivityResult(requestCode,resultcode,intent)
dipanggil, lalu Anda dapat meneleponfragments onActivityResult()
dari sini, meneruskanrequestCode, resultCode and intent
.sumber
Di dalam fragmen Anda, panggil
di mana
this
mengacu pada fragmen. Jika tidak, lakukan seperti yang dikatakan @Clevester:Saya juga harus menelepon
dalam aktivitas induk
onActivityResult
untuk membuatnya berfungsi.(Saya mengadaptasi jawaban ini dari jawaban @ Clevester.)
sumber
Bagi mereka yang menggunakan Android Komponen Navigasi harus menggunakan dalam Kegiatan ini
onActivityResult(...)
dalamprimaryNavigationFragment
untuk mendapatkan itu referensi fragmen dan panggilan fragmen inifragment.onActivityResult(...)
.Inilah Kegiatan
onActivityResult(...)
sumber
Sebagian besar jawaban ini terus mengatakan bahwa Anda harus memanggil
super.onActivityResult(...)
tuan rumahActivity
Anda untuk AndaFragment
. Tapi itu sepertinya tidak berhasil untukku.Jadi, di host
Activity
Anda, Anda harus memanggil AndaFragments
onActivityResult(...)
sebagai gantinya. Berikut ini sebuah contoh.Pada titik tertentu di Anda,
HostActivity
Anda perlu menetapkanthis.myFragment
yangFragment
Anda gunakan. Atau, gunakanFragmentManager
untuk mendapatkanFragment
alih - alih menyimpan referensi di dalamnyaHostActivity
. Juga, periksanull
sebelum Anda mencoba meneleponthis.myFragment.onActivityResult(...);
.sumber
sumber
Anda bisa mengesampingkan BaseActivity
onActivityResult
pada fragmenbaseActivity.startActivityForResult
.Pada BaseActivity menambahkan antarmuka dan menimpa onActivityResult.
Pada implementasi Fragment
OnBaseActivityResult
Solusi ini akan melakukan trik.
sumber
Jika masalah di atas dihadapi saat login Facebook maka Anda dapat menggunakan kode di bawah ini dalam aktivitas induk dari fragmen Anda seperti:
Atau:
Dan tambahkan panggilan di bawah ini dalam fragmen Anda ...
sumber
Kasus penggunaan lain yang belum dijelaskan dalam jawaban lain:
onActivityResult()
dideklarasikan dalam fragmen tidak dipanggil saat menggunakanexception.startResolutionForResult()
:Dalam hal ini ganti
exception.startResolutionForResult()
dengan fragmenstartIntentSenderForResult()
:sumber
Versi Kotlin (Dalam aktivitas Anda diActivityResult ())
sumber
Seperti yang disebutkan Ollie C, ada bug aktif untuk pustaka dukungan menggunakan nilai yang dikembalikan ke onActivityResult saat Anda menggunakan fragmen bersarang. Saya baru saja memukulnya :-(.
Lihat Fragment.onActivityResult tidak dipanggil saat requestCode! = 0 .
sumber
Saya memiliki kecurigaan yang kuat bahwa semua jawaban di sini tidak lebih dari peretasan. Saya sudah mencoba semuanya dan banyak yang lain, tetapi tanpa kesimpulan yang dapat diandalkan karena selalu ada semacam masalah bodoh. I untuk satu tidak dapat mengandalkan hasil yang tidak konsisten. Jika Anda melihat dokumentasi API Android resmi untuk Fragmen, Anda akan melihat Google dengan jelas menyatakan sebagai berikut:
Lihat: Android Fragment API
Jadi, tampaknya pendekatan yang paling benar dan andal adalah dengan memanggil startActivityForResult () dari aktivitas hosting dan juga menangani onActivityResult () yang dihasilkan dari sana.
sumber
mActivity.startActivityFromFragment(this, intent, requestCode)
- jadi tidak ada yang lain selain pembungkus kenyamananKode Anda memiliki fragmen bersarang. Memanggil super.onActivityForResult tidak berfungsi
Anda tidak ingin mengubah setiap aktivitas yang dapat dipanggil dari fragmen Anda dan atau berusaha menyelesaikan setiap fragmen dalam rantai fragmen.
Ini adalah salah satu dari banyak solusi kerja. buat fragmen dengan cepat dan kirimkan langsung ke aktivitas dengan manajer fragmen dukungan. Kemudian panggil startActivityForResult dari fragmen yang baru dibuat.
sumber
Masalah saya adalah dengan aktivitas Host saya menemukannya dengan set
android:launchMode="standard"
saya menghapusnya sementara itu berfungsi!sumber
onActivityResult tidak akan berfungsi jika mode peluncuran Anda diatur ke SingleInstance atau SingleTask. atau Anda memanggil aktivitas Anda menggunakan IntentFilters ini
standard
atausingleTop
mode peluncuran akan berfungsi dengan baik.sumber
Jika Anda menggunakan fragmen bersarang, ini juga berfungsi:
Selain itu, Anda harus memanggil
super.onActivityResult
dari aktivitas induk dan mengisionActivityResult
metode fragmen.sumber
Saya telah menangani masalah ini dengan menulis kelas dasar yang diperluas
Fragment
, dan dalamonactivityresult
aktivitas tersebut saya telah mengidentifikasi fragmen yang sedang berjalan menggunakanfragmenttag
. Kemudian saya memanggil metode yang ditentukan pengguna dalam kelas fragmentbase. Ini akan memecat suatu peristiwa dalam fragmen yang sedang berjalan.sumber