startActivityForResult () de um fragmento e atividade filho final, não chama onActivityResult () no fragmento

172

FirstActivity.Javatem um FragmentA.Javaque chama startActivityForResult(). SecondActivity.Javaligue, finish()mas onActivityResultnunca seja chamado, escrito em FragmentA.Java.

FragmentA.Java código:

  @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 código:

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

Eu tentei depurar o código, mas onAcitvityResult()nunca fui chamado.

Roshan Pawar
fonte
1
Tente colocá-lo (método onActivityResult) na classe FirstActivity
viplezer
2
possível duplicata de onActivityResult não sendo chamado Fragmento
QED

Respostas:

271

Você deve escrever onActivityResult()no seu da FirstActivity.Javaseguinte forma

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

Então, isso chamará o seu fragmento de onActivityResult()

Edit: a solução é substituir getActivity().startActivityForResult(i, 1);porstartActivityForResult(i, 1);

Kevin Adesara
fonte
4
Obrigado @ Kevin, eu tentei o que você disse, mas não está funcionando. Mas eu depurado o código, eu vejo onActivityresult()de FirstAcivity.Javaé chamado e onActivityresult()de FragmentA.Javanunca ter chamado. Por favor ajude.
Roshan Pawar,
52
Substitua getActivity (). StartActivityForResult (i, 1); com startActivityForResult (i, 1);
Kevin Adesara
14
Será que a resposta na solução aceita não é realmente o que está errado aqui, e a solução real é apenas usar em startActivityForResultvez de getActivity().start...? Porque, tanto quanto eu posso ver, você está substituindo a definição de onActivityResultpor sua própria definição, na Atividade (ou seja, isso se comporta exatamente da mesma maneira que se a substituição na resposta não existisse).
amnn
@asQuirreL Sim. este é provavelmente o motivo.
desenvolvedor android
1
Eu faço o mesmo como você explicar, override onActivityResult () em atividade também no fragmento com super em ambos e fazer startActivityForResult (intenção, i), mas não funcionou, eu preciso de ajuda por favor
Amal Kronz
33

A resposta de Kevin funciona, mas dificulta a reprodução dos dados usando essa solução.

A melhor solução é não iniciar startActivityForResult()no nível da atividade.

no seu caso, não ligue getActivity().startActivityForResult(i, 1);

Em vez disso, basta usar startActivityForResult()e ele funcionará perfeitamente bem! :)

Amit Patel
fonte
27

Você deve escrever onActivityResult () em seu FirstActivity.Java da seguinte maneira

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

Isso acionará o método onActivityResult de fragmentos no FirstActivity.java

Rahul Giradkar
fonte
2
obrigado companheiro! mas é necessária uma API de nível 26. Portanto, no meu caso, usei o método getSupportFragmentManager (). findFragmentByTag, mas com a sua ideia #
485 Dagnogo Jean-François
15

O fragmento já possui startActivityForResult, que chamaria onActivityResulto fragmento se você o usar, em vez de getActivity()...

desenvolvedor android
fonte
7

A coisa mais importante, que está faltando tudo aqui é ... O launchMode of FirstActivity deve ser singleTop. Se for singleInstance, o onActivityResult no FragmentA será chamado logo após chamar o método startActivityForResult. Portanto, ele não aguardará a chamada do método finish () no SecondActivity.

Então, siga as etapas a seguir. Definitivamente funcionará, pois também funcionou para mim após uma longa pesquisa.

No arquivo AndroidManifest.xml, torne launchMode de FirstActivity.Java como singleTop.

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

No FirstActivity.java, substitua o método onActivityResult. Como isso chamará o onActivityResult of FragmentA.

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

No FragmentA.Java, substitua o método onActivityResult

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

Chamada startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);de FragmentA.Java

finish();Método de chamada em SecondActivity.java

Espero que isso funcione.

Md Shahbaz Ahmad
fonte
Esta é a melhor resposta. Os detalhes da definição do "launchMode" no Manifesto são vitais.
Pablo Insua
5

Poderíamos ligar startActivityForResult()diretamente do Fragment. Então, você deve ligar em this.startActivityForResult(i, 1);vez degetActivity().startActivityForResult(i, 1);

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

A atividade enviará o resultado da atividade para o seu fragmento.

Sanjaymith
fonte
1

Que seja tarde para a resposta. Mas será útil para qualquer um.

No meu caso, quero chamar a atividade do Fragment e setResult novamente do fragmento.

Eu usei o getContext do Fragment Like.

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

E definir resultado do fragmento

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

Agora, obtendo o resultado para fragmentar com

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

    }
}
ajay singh
fonte
0

onActivityResult () de MAinActivity chamará, onActivityResult () de Fragement não chamará porque fragmento é colocado em Activity, então obviamente ele volta para MainActivity

dileep krishnan
fonte
-2

Não chame finish()no onCreate()método, em seguida, ele funciona bem.

Nagaraj Wadakannavar
fonte
-6

chame seu onActivityresult()em ParentActivity.

URAndroid
fonte
Obrigado pela resposta @URAndroid, mas consegui a solução. Sua solução não é perfeita. Não é uma boa programação.
Roshan Pawar,
Na verdade, isso não é recomendado.
Lo-Tan