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.


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


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


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


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


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.


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.


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

    }
}

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



-6

zadzwoń do swojego onActivityresult()w ParentActivity.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.