startActivityForResult () da un frammento e completamento dell'attività figlio, non chiama onActivityResult () in frammento


172

FirstActivity.Javaha un FragmentA.Javache chiama startActivityForResult(). SecondActivity.Javachiama finish()ma onActivityResultnon essere mai chiamato, che è scritto in FragmentA.Java.

FragmentA.Java codice:

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

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

Ho provato a eseguire il debug del codice, ma onAcitvityResult()non sono mai stato chiamato.


1
Prova a metterlo (metodo onActivityResult) nella classe
FirstActivity

Risposte:


271

Devi scrivere onActivityResult()nel tuo FirstActivity.Javacome segue

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

Quindi questo chiamerà il tuo frammento onActivityResult()

Modifica: la soluzione è sostituirla getActivity().startActivityForResult(i, 1);constartActivityForResult(i, 1);


4
Grazie @Kevin, ho provato quello che hai detto ma non funziona. Ma ho eseguito il debug del codice, vedo onActivityresult()di essere FirstAcivity.Javachiamato e onActivityresult()di FragmentA.Javanon essere mai chiamato. Per favore aiuto.
Roshan Pawar,

52
Sostituisci getActivity (). StartActivityForResult (i, 1); con startActivityForResult (i, 1);
Kevin Adesara,

14
Potrebbe essere che la risposta nella soluzione accettata non sia effettivamente ciò che è sbagliato qui, e la vera soluzione è semplicemente usare startActivityForResultinvece di getActivity().start...? Perché, per quanto posso vedere, stai sovrascrivendo la definizione onActivityResultcon la sua stessa definizione, nell'Attività (cioè questo si comporta esattamente come se la sostituzione nella risposta non esistesse).
amnn

@asQuirreL Sì. questo è probabilmente il motivo.
sviluppatore Android il

1
Faccio lo stesso che mi spieghi, sovrascrivo su AttivityResult () in attività anche in frammento con super in entrambi e faccio startActivityForResult (intento, i), ma non ha funzionato, ho bisogno di aiuto per favore
Amal Kronz

33

La risposta di Kevin funziona ma rende difficile giocare con i dati usando quella soluzione.

La soluzione migliore è non iniziare startActivityForResult()a livello di attività.

nel tuo caso non chiamare getActivity().startActivityForResult(i, 1);

Invece, basta usare startActivityForResult()e funzionerà perfettamente! :)


27

È necessario scrivere onActivityResult () in FirstActivity.Java come segue

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

Ciò attiverà il metodo onActivityResult di frammenti su FirstActivity.java


2
grazie compagno ! ma richiede un'API di livello 26 .. quindi nel mio caso ho usato il metodo getSupportFragmentManager (). findFragmentByTag ma con la tua idea
Dagnogo Jean-François

15

Il frammento ha già startActivityForResult, che chiamerebbe onActivityResultnel frammento se lo si utilizza, invece di getActivity()...


7

La cosa più importante, che qui mancano tutti è ... Il launchMode di FirstActivity deve essere singleTop. Se è singleInstance, onActivityResult in FragmentA verrà chiamato subito dopo aver chiamato il metodo startActivityForResult. Quindi, non attenderà la chiamata del metodo finish () in SecondActivity.

Quindi passa attraverso i seguenti passaggi, funzionerà sicuramente come ha funzionato anche per me dopo una lunga ricerca.

Nel file AndroidManifest.xml, imposta launchMode di FirstActivity.Java come singleTop.

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

In FirstActivity.java, sovrascrivi il metodo onActivityResult. Come questo chiamerà onActivityResult di FragmentA.

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

In FragmentA.Java, sovrascrivi il metodo onActivityResult

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

Chiama startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);da FragmentA.Java

Chiamata finish();Metodo di in SecondActivity.java

Spero che questo funzioni.


Questa è la risposta migliore Il dettaglio della definizione di "launchMode" in Manifest è di vitale importanza.
Pablo Insua,

5

Potremmo chiamare startActivityForResult()direttamente dal frammento, quindi dovresti chiamare this.startActivityForResult(i, 1);invece digetActivity().startActivityForResult(i, 1);

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

L'attività invierà il risultato dell'attività al frammento.


1

Che sia tardi per la risposta. Ma sarà utile per chiunque.

Nel mio caso, voglio richiamare l'attività dal frammento e impostare nuovamente il risultato dal frammento.

Ho usato getContext di Fragment Like.

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

E imposta il risultato dal frammento

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

Ora ottenere il risultato in frammento con

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

    }
}

0

onActivityResult () di MAinActivity chiamerà, onActivityResult () di Fragement non chiamerà perché il frammento è posto in Attività, quindi ovviamente torna a MainActivity



-6

chiama il tuo onActivityresult()in ParentActivity.


Grazie per la risposta @URAndroid, ma hai ottenuto la soluzione. La tua soluzione non è perfetta. Non è una buona programmazione.
Roshan Pawar,

Questo in realtà non è raccomandato.
Lo-Tan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.