startActivityForResult () z fragmentu i kończące działanie podrzędne, nie wywołuje onActivityResult () we fragmencie

172

FirstActivity.Javama FragmentA.Javaktóry dzwoni startActivityForResult(). SecondActivity.Javazadzwonić, finish()ale onActivityResultnigdy nie dzwonić, co jest napisane FragmentA.Java.

FragmentA.Java kod:

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

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

Próbowałem debugować kod, ale onAcitvityResult()nigdy nie zostałem wezwany.

Pan Roshan Pawar
źródło
1
Spróbuj umieścić to (metoda onActivityResult) w klasie
FirstActivity

Odpowiedzi:

271

Musisz napisać onActivityResult()w FirstActivity.Javanastępujący sposób

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

Więc to zadzwoni do twojego fragmentu onActivityResult()

Edit: rozwiązaniem jest zastąpienie getActivity().startActivityForResult(i, 1);zstartActivityForResult(i, 1);

Kevin Adesara
źródło
4
Dzięki @Kevin, wypróbowałem to, co powiedziałeś, ale nie działa. Ale i debugowania kodu, widzę onActivityresult()ze FirstAcivity.Javajest wywoływana i onActivityresult()od FragmentA.Javanigdy się nie sprawdził. Proszę pomóż.
Pan Roshan Pawar
52
Zastąp getActivity (). StartActivityForResult (i, 1); z startActivityForResult (i, 1);
Kevin Adesara
14
Czy to możliwe, że odpowiedź w przyjętym rozwiązaniu w rzeczywistości nie brzmi: co jest nie tak, a prawdziwym rozwiązaniem jest po prostu użyć startActivityForResultzamiast getActivity().start...? Ponieważ z tego, co widzę, zastępujesz definicję onActivityResultwłasną definicją w Działaniu (tj. Zachowuje się to dokładnie tak samo, jakby nadpisanie w odpowiedzi nie istniało).
amnn,
@asQuirreL Yes. to jest prawdopodobnie powód.
programista Androida,
1
Robię to samo, co wyjaśniasz, nadpisuję onActivityResult () w aktywności również we fragmencie z super w obu i robię startActivityForResult (intent, i), ale nie zadziałało, potrzebuję pomocy proszę
Amal Kronz
33

Odpowiedź Kevina działa, ale utrudnia zabawę z danymi przy użyciu tego rozwiązania.

Najlepszym rozwiązaniem jest nie zaczynać startActivityForResult()na poziomie aktywności.

w twoim przypadku nie dzwoń getActivity().startActivityForResult(i, 1);

Zamiast tego po prostu użyj startActivityForResult()i będzie działać idealnie! :)

Amit Patel
źródło
27

Musisz napisać onActivityResult () w swoim FirstActivity.Java w następujący sposób

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

Spowoduje to wyzwolenie metody onActivityResult fragmentów na FirstActivity.java

Rahul Giradkar
źródło
2
dzięki stary ! ale wymaga API poziomu 26 .. więc w moim przypadku użyłem metody getSupportFragmentManager (). findFragmentByTag, ale z twoim pomysłem
Dagnogo Jean-François
15

Fragment już ma startActivityForResult, co spowoduje wywołanie onActivityResultfragmentu, jeśli go użyjesz, zamiast getActivity()...

programista Androida
źródło
7

Najważniejszą rzeczą, której tu wszystkiego brakuje, jest ... Tryb uruchamiania FirstActivity musi być singleTop. Jeśli jest to singleInstance, onActivityResult w FragmentA zostanie wywołany zaraz po wywołaniu metody startActivityForResult. Nie będzie więc czekać na wywołanie metody finish () w SecondActivity.

Wykonaj więc następujące kroki, na pewno zadziała, ponieważ zadziałało również dla mnie po długich badaniach.

W pliku AndroidManifest.xml ustaw launchMode FirstActivity.Java jako singleTop.

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

W FirstActivity.java Zastąp metodę onActivityResult. Ponieważ spowoduje to wywołanie onActivityResult z FragmentA.

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

W FragmentA.Java zastąp metodę onActivityResult

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

Telefon startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);od FragmentA.Java

Call finish();w SecondActivity.java

Mam nadzieję, że to zadziała.

Md Shahbaz Ahmad
źródło
To najlepsza odpowiedź. Istotne znaczenie ma szczegółowość definiowania „launchMode” w manifeście.
Pablo Insua
5

Moglibyśmy zadzwonić startActivityForResult()bezpośrednio z Fragmentu, więc powinieneś zadzwonić this.startActivityForResult(i, 1);zamiastgetActivity().startActivityForResult(i, 1);

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

Aktywność wyśle ​​Wynik Działania do Twojego Fragmentu.

sanjaymith
źródło
1

Oby było późno na odpowiedź. Ale będzie pomocny dla każdego.

W moim przypadku chcę wywołać aktywność z fragmentu i setResult z powrotem z fragmentu.

Użyłem getContext of Fragment Like.

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

I ustaw wynik z fragmentu

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

Teraz pobieranie wyniku do fragmentacji za pomocą

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

    }
}
ajay singh
źródło
0

onActivityResult () z MAinActivity wywoła, onActivityResult () z Fragement nie wywoła, ponieważ fragment jest umieszczony w Activity, więc oczywiście wróci do MainActivity

dileep krishnan
źródło
-2

Nie nazywaj finish()w onCreate()sposób to działa dobrze.

Nagaraj Wadakannavar
źródło
-6

zadzwoń do swojego onActivityresult()w ParentActivity.

URAndroid
źródło
Dzięki za odpowiedź @URAndroid, ale mam rozwiązanie. Twoje rozwiązanie nie jest idealne. To nie jest dobre programowanie.
Pan Roshan Pawar
W rzeczywistości nie jest to zalecane.
Lo-Tan