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.


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


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


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


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


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.


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.


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

    }
}

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



-6

Rufen Sie Ihre onActivityresult()in ParentActivity an.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.