startActivityForResult () aus einem Fragment und das Beenden einer untergeordneten Aktivität ruft onActivityResult () in Fragment nicht auf

172

FirstActivity.Javahat ein FragmentA.Javawas anruft startActivityForResult(). SecondActivity.JavaAnruffinish() aber onActivityResultniemals angerufen werden, was geschrieben steht FragmentA.Java.

FragmentA.Java Code:

  @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 Code:

  @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();
  }

Ich habe versucht, den Code zu debuggen, werde aber onAcitvityResult()nie aufgerufen.

Herr Roshan Pawar
quelle
1
Versuchen Sie, es (onActivityResult-Methode) in die FirstActivity-Klasse aufzunehmen
viplezer

Antworten:

271

Sie müssen schreiben onActivityResult()in Ihrem FirstActivity.Javawie folgt

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

Das nennt also dein Fragment onActivityResult()

Edit: die Lösung zu ersetzen , getActivity().startActivityForResult(i, 1);mitstartActivityForResult(i, 1);

Kevin Adesara
quelle
4
Danke @ Kevin, ich habe versucht, was du gesagt hast, aber es funktioniert nicht. Aber ich habe den Code debuggt, ich sehe onActivityresult()von FirstAcivity.Javawird aufgerufen und onActivityresult()von wird FragmentA.Javanie aufgerufen. Bitte helfen Sie.
Herr Roshan Pawar
52
Bitte ersetzen Sie getActivity (). StartActivityForResult (i, 1); mit startActivityForResult (i, 1);
Kevin Adesara
14
Könnte es sein, dass die Antwort in der akzeptierten Lösung tatsächlich nicht das ist, was hier falsch ist, und die wirkliche Lösung darin besteht, nur startActivityForResultstatt zu verwenden getActivity().start...? Denn soweit ich sehen kann, überschreiben Sie die Definition von onActivityResultmit einer eigenen Definition in der Aktivität (dh dies verhält sich genauso, als ob die Überschreibung in der Antwort nicht vorhanden wäre).
Amnn
@asQuirreL Ja. Dies ist wahrscheinlich der Grund.
Android-Entwickler
1
Ich mache das gleiche wie du erklärst, überschreibe onActivityResult () in Aktivität auch in Fragment mit Super in beiden und mache startActivityForResult (Absicht, i), aber es hat nicht funktioniert, ich brauche bitte Hilfe
Amal Kronz
33

Kevins Antwort funktioniert, aber es macht es schwierig, mit den Daten dieser Lösung zu spielen.

Die beste Lösung ist, nicht startActivityForResult()auf Aktivitätsebene zu beginnen.

in deinem Fall ruf nicht an getActivity().startActivityForResult(i, 1);

Verwenden startActivityForResult()Sie stattdessen einfach und es wird einwandfrei funktionieren! :) :)

Amit Patel
quelle
27

Sie müssen onActivityResult () wie folgt in FirstActivity.Java schreiben

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

Dies löst die onActivityResult-Methode für Fragmente in FirstActivity.java aus

Rahul Giradkar
quelle
2
danke Kumpel! Da es jedoch eine Level 26-API erfordert, habe ich in meinem Fall die Methode getSupportFragmentManager (). findFragmentByTag verwendet, aber mit Ihrer Idee
Dagnogo Jean-François
15

Das Fragment hat bereits startActivityForResult, was onActivityResultdas Fragment aufrufen würde, wenn Sie es verwenden, anstatt getActivity()...

Android-Entwickler
quelle
7

Das Wichtigste, was hier alles fehlt, ist ... Der Startmodus von FirstActivity muss singleTop sein. Wenn es sich um singleInstance handelt, wird das onActivityResult in FragmentA direkt nach dem Aufruf der startActivityForResult-Methode aufgerufen. Es wird also nicht auf den Aufruf der Methode finish () in SecondActivity warten.

Gehen Sie also die folgenden Schritte durch: Es wird definitiv funktionieren, da es nach langer Recherche auch für mich funktioniert hat.

Machen Sie in der Datei AndroidManifest.xml launchMode von FirstActivity.Java zu singleTop.

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

Überschreiben Sie in FirstActivity.java die onActivityResult-Methode. Da dies das onActivityResult von FragmentA aufruft.

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

Überschreiben Sie in FragmentA.Java die onActivityResult-Methode

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

Aufruf startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);von FragmentA.Java

Rufen Sie die finish();Methode in SecondActivity.java auf

Hoffe das wird funktionieren.

Md Shahbaz Ahmad
quelle
Dies ist die beste Antwort. Das Detail der Definition des "launchMode" im Manifest ist von entscheidender Bedeutung.
Pablo Insua
5

Wir nennen könnte startActivityForResult()direkt aus Fragment So rufen Sie sollten this.startActivityForResult(i, 1);stattgetActivity().startActivityForResult(i, 1);

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

Aktivität sendet das Aktivitätsergebnis an Ihr Fragment.

Sanjaymith
quelle
1

Möge es spät für die Antwort sein. Wird aber für jeden hilfreich sein.

In meinem Fall möchte ich Aktivität von Fragment aufrufen und setResult vom Fragment zurücksetzen.

Ich habe getContext von Fragment Like verwendet.

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

Und Ergebnis aus Fragment setzen

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

Jetzt Ergebnis zum Fragmentieren mit

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

    }
}
Ajay Singh
quelle
0

onActivityResult () von MAinActivity wird aufgerufen, onActivityResult () von Fragement wird nicht aufgerufen, da das Fragment in Activity platziert ist, sodass es offensichtlich zu MainActivity zurückkehrt

Dileep krishnan
quelle
-2

Rufen Sie nicht finish()in onCreate()Verfahren dann funktioniert es gut.

Nagaraj Wadakannavar
quelle
-6

Rufen Sie Ihre onActivityresult()in ParentActivity an.

URAndroid
quelle
Danke für die Antwort @URAndroid, habe aber die Lösung bekommen. Ihre Lösung ist nicht perfekt. Es ist keine gute Programmierung.
Herr Roshan Pawar
Dies wird eigentlich nicht empfohlen.
Lo-Tan