startActivityForResult () dari Fragmen dan menyelesaikan Aktivitas anak, tidak memanggil onActivityResult () di Fragment

172

FirstActivity.Javamemiliki FragmentA.Javapanggilan mana startActivityForResult(). SecondActivity.Javamenelepon finish()tetapi onActivityResulttidak pernah dipanggil yang tertulis di FragmentA.Java.

FragmentA.Java kode:

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // some code
    Intent i = new Intent(getActivity(), SecondActivity.class);
    i.putExtra("helloString", helloString);
    getActivity().startActivityForResult(i, 1);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    getActivity();
    if(requestCode == 1 && resultCode == Activity.RESULT_OK) {
       //some code
    }
  }

SecondActivity.Java kode:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       //some code
       Intent returnIntent = new Intent();
       returnIntent.putExtra("result", result);                          

       setResult(Activity.RESULT_OK,returnIntent);     
       finish();
  }

Saya telah mencoba men-debug kode, tetapi onAcitvityResult()tidak pernah dipanggil.

Tuan Roshan Pawar
sumber
1
Cobalah untuk memasukkannya (metode onActivityResult) di kelas FirstActivity
viplezer
2
kemungkinan duplikat dari onActivityResult tidak dipanggil di Fragment
QED

Jawaban:

271

Anda harus menulis onActivityResult()di Anda FirstActivity.Javasebagai berikut

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
}

Jadi ini akan memanggil fragmen Anda onActivityResult()

Sunting: solusinya adalah ganti getActivity().startActivityForResult(i, 1);denganstartActivityForResult(i, 1);

Kevin Adesara
sumber
4
Terima kasih @Kevin, saya mencoba apa yang Anda katakan tetapi tidak berhasil. Tetapi saya debug kode, saya melihat onActivityresult()dari FirstAcivity.Javadipanggil dan onActivityresult()dari FragmentA.Javatidak pernah dipanggil. Tolong bantu.
Bpk. Roshan Pawar
52
Silakan ganti getActivity (). StartActivityForResult (i, 1); dengan startActivityForResult (i, 1);
Kevin Adesara
14
Mungkinkah jawaban dalam solusi yang diterima sebenarnya bukan apa yang salah di sini, dan solusi yang sebenarnya adalah hanya menggunakan startActivityForResultbukan getActivity().start...? Karena sejauh yang saya bisa lihat, Anda menimpa definisi onActivityResultdengan definisi sendiri, dalam Aktivitas (yaitu ini berperilaku persis sama seperti jika penimpaan dalam jawaban tidak ada).
amnn
@ asQuirreL Ya. ini mungkin alasannya.
pengembang android
1
Saya melakukan hal yang sama seperti yang Anda jelaskan, timpa padaActivityResult () dalam aktivitas juga dalam fragmen dengan super di keduanya dan buat startActivityForResult (maksud, i), tetapi tidak berhasil, saya perlu bantuan tolong
Amal Kronz
33

Jawaban Kevin berhasil tetapi itu membuatnya sulit untuk bermain dengan data menggunakan solusi itu.

Solusi terbaik adalah jangan mulai startActivityForResult()dari level aktivitas.

dalam kasus Anda jangan panggil getActivity().startActivityForResult(i, 1);

Sebaliknya, gunakan saja startActivityForResult()dan itu akan bekerja dengan baik! :)

Amit Patel
sumber
27

Anda harus menulis onActivityResult () di FirstActivity.Java Anda sebagai berikut

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

Ini akan memicu metode fragmen onActivityResult di FirstActivity.java

Rahul Giradkar
sumber
2
terima kasih sobat! tetapi membutuhkan API Level 26 .. jadi dalam kasus saya saya menggunakan metode getSupportFragmentManager (). findFragmentByTag tetapi dengan ide Anda
Dagnogo Jean-François
15

Fragmen sudah memiliki startActivityForResult, yang akan memanggil onActivityResultfragmen jika Anda menggunakannya, alih-alih getActivity()...

pengembang android
sumber
7

Yang paling penting, yang semuanya hilang di sini adalah ... LaunchMode dari FirstActivity harus singleTop. Jika itu singleInstance, onActivityResult di FragmentA akan dipanggil tepat setelah memanggil metode startActivityForResult. Jadi, itu tidak akan menunggu pemanggilan metode finish () di SecondActivity.

Jadi, ikuti langkah-langkah berikut, Ini pasti akan berhasil karena itu bekerja untuk saya juga setelah penelitian yang panjang.

Dalam file AndroidManifest.xml, jadikan launchMode dari FirstActivity.Java sebagai singleTop.

<activity
        android:name=".FirstActivity"
        android:label="@string/title_activity_main"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar" />

Di FirstActivity.java, timpa metode onActivityResult. Karena ini akan memanggil onActivityResult of FragmentA.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

Di FragmentA.Java, timpa metode onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("FragmentA.java","onActivityResult called");
}

Telepon startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);dari FragmentA.Java

finish();Metode panggilan di SecondActivity.java

Semoga ini berhasil.

Md Shahbaz Ahmad
sumber
Ini jawaban terbaik. Detail mendefinisikan "launchMode" di Manifest sangat penting.
Pablo Insua
5

Kita bisa menelepon startActivityForResult()langsung dari Fragmen Jadi Anda harus menelepon this.startActivityForResult(i, 1);alih-alihgetActivity().startActivityForResult(i, 1);

Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);

Aktivitas akan mengirimkan Hasil Aktivitas ke Fragmen Anda.

sanjaymith
sumber
1

Semoga sudah terlambat untuk jawabannya. Tetapi akan sangat membantu bagi siapa pun.

Dalam kasus saya ingin memanggil aktivitas dari Fragmen dan setResult kembali dari fragmen.

Saya telah menggunakan getContext of Fragment Like.

startActivityForResult(new Intent(getContext(), NextActivity.class), 111);

Dan Set Hasil dari Fragmen

getActivity().setResult(Activity.RESULT_OK);
                    getActivity().finish();

Sekarang Mendapatkan Hasil menjadi Fragmen dengan

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && requestCode == 111) {

    }
}
ajay singh
sumber
0

onActivityResult () dari MAinActivity akan memanggil, onActivityResult () dari Fragement tidak akan memanggil karena fragmen ditempatkan di Aktivitas jadi jelas kembali ke MainActivity

dileep krishnan
sumber
-2

Jangan panggil finish()di onCreate()metode maka itu bekerja dengan baik.

Nagaraj Wadakannavar
sumber
-6

telepon Anda onActivityresult()di ParentActivity.

URAndroid
sumber
Terima kasih atas jawaban @URAndroid, tetapi dapatkan solusinya. Solusi Anda tidak sempurna. Ini bukan pemrograman yang bagus.
Bpk. Roshan Pawar
Ini sebenarnya tidak direkomendasikan.
Lo-Tan