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.


1
Cobalah untuk memasukkannya (metode onActivityResult) di kelas FirstActivity
viplezer

2
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);


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! :)


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


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()...


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.


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.


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) {

    }
}

0

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



-6

telepon Anda onActivityresult()di ParentActivity.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.