it-swarm.com.de

startActivityForResult () von einem Fragment und abschließende untergeordnete Aktivität, ruft in Fragment nicht onActivityResult () auf

FirstActivity.Java Hat einen FragmentA.Java, Der startActivityForResult() aufruft. SecondActivity.Java Rufe finish() auf, aber onActivityResult wird nie aufgerufen, was in FragmentA.Java Geschrieben ist.

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, aber onAcitvityResult() wird nie aufgerufen.

156
Mr Roshan Pawar

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

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

Das ruft also das onActivityResult() Ihres Fragments auf.

Edit: Die Lösung besteht darin, getActivity().startActivityForResult(i, 1); durch startActivityForResult(i, 1); zu ersetzen.

240
Kevin Adesara

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

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

in deinem Fall rufe nicht getActivity().startActivityForResult(i, 1); auf

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

32
Amit Patel

Sie müssen onActivityResult () in FirstActivity.Java wie folgt 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 von Fragmenten in FirstActivity.Java aus

23
Rahul Giradkar

Das Fragment hat bereits startActivityForResult, das onActivityResult im Fragment aufruft, wenn Sie es verwenden, anstelle von getActivity()...

12

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

Gehen Sie also die folgenden Schritte durch. Es wird definitiv funktionieren, wie es auch bei mir nach langer Recherche funktioniert hat.

Erstellen Sie in der Datei AndroidManifest.xml den Startmodus von FirstActivity.Java als 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 aufrufen wird.

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

Rufen Sie startActivityForResult(intent, HOMEWORK_POST_ACTIVITY); von FragmentA.Java aus auf

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

Hoffe das wird funktionieren.

5
Shahbaz Ahmad

Wir könnten startActivityForResult() direkt von Fragment aufrufen. Sie sollten also this.startActivityForResult(i, 1); anstelle von getActivity().startActivityForResult(i, 1); aufrufen.

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

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

4
sanjaymith

onActivityResult () von MAinActivity ruft auf, onActivityResult () on Fragment kann nicht aufgerufen werden, da das Fragment in Activity platziert ist und somit offensichtlich zu MainActivity zurückkehrt

0
dileep krishnan