Bir Fragment ve bitirme alt Etkinliğinden startActivityForResult (), Fragment'ta onActivityResult () yöntemini çağırmaz


172

FirstActivity.Javabir FragmentA.Javaçağrı var startActivityForResult(). SecondActivity.JavaArayın finish()ama onActivityResultasla çağrılma 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();
  }

Kod hata ayıklama denedim, ama onAcitvityResult()asla çağrılır.


1
FirstActivity sınıfına (onActivityResult yöntemi) koymaya çalışın
viplezer

Yanıtlar:


271

Sen yazmalısınız onActivityResult()sizin de FirstActivity.Javaaşağıdaki gibi

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

Yani bu parçanıza onActivityResult()

Düzenleme: çözüm değiştirmektir getActivity().startActivityForResult(i, 1);ilestartActivityForResult(i, 1);


4
Teşekkürler @ Kevin, söylediklerini denedim ama işe yaramıyor. Ama ben, bkz kodu debug onActivityresult()ait FirstAcivity.Javaçağrılan ve onActivityresult()bir FragmentA.Javaasla denilen olsun. Lütfen yardım et.
Bay Roshan Pawar

52
Lütfen getActivity () öğesini değiştirin. StartActivityForResult (i, 1); startActivityForResult (i, 1) ile;
Kevin Adesara

14
Kabul edilen çözümdeki cevabın aslında burada yanlış olan şey olmadığı ve gerçek çözümün startActivityForResultyerine sadece kullanmak olduğu olabilir getActivity().start...mi? Çünkü görebildiğim kadarıyla onActivityResult, Aktivitede kendi tanımıyla tanımını geçersiz kılıyorsunuz (yani, cevaptaki geçersiz kılma yokmuş gibi).
amnn

@asQuirreL Evet. muhtemelen nedeni budur.
android geliştirici

1
Açıkladığınız gibi yapıyorum, aktivitede onActivityResult () işlevini de her ikisinde de süper ile parçalayın ve startActivityForResult (niyet, i) yapın, ancak işe yaramadı, lütfen yardıma ihtiyacım var
Amal Kronz 24:18

33

Kevin'in cevabı işe yarıyor ama bu çözümü kullanarak verilerle oynamayı zorlaştırıyor.

En iyi çözüm startActivityForResult()aktivite düzeyinde başlamamaktır .

senin durumunda arama getActivity().startActivityForResult(i, 1);

Bunun yerine, sadece kullanın startActivityForResult()ve mükemmel bir şekilde çalışacaktır! :)


27

FirstActivity.Java'nıza onActivityResult () yöntemini aşağıdaki gibi yazmalısınız

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

Bu, FirstActivity.java'daki parçaların onActivityResult yöntemini tetikleyecektir


2
teşekkürler dostum ! ama bu bir 26.Seviye API'sı gerektiriyor. Bu yüzden benim durumumda getSupportFragmentManager (). findFragmentByTag yöntemini kullandım ama fikrinizle
Dagnogo Jean-François 25:18 '

15

Parçanın zaten var startActivityForResult, onActivityResulteğer kullanırsanız parçayı çağırır , bunun yerine getActivity()...


7

En önemlisi, burada eksik olan şey ... FirstActivity'nin launchMode'u singleTop olmalıdır. SingleInstance ise, startActivityForResult yöntemi çağrıldıktan hemen sonra FragmentA öğesindeki onActivityResult çağrılır. Bu nedenle, SecondActivity'de finish () yönteminin çağrılmasını beklemez.

Bu yüzden aşağıdaki adımları izleyin, Uzun bir araştırmadan sonra da benim için çalıştığı gibi kesinlikle çalışacaktır.

AndroidManifest.xml dosyasında, FirstActivity.Java'nın launchMode'unu singleTop olarak yapın.

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

FirstActivity.java'da, onActivityResult yöntemini geçersiz kılın. Bu, onActivityResult of FragmentA'yı çağırır.

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

FragmentA.Java'da onActivityResult yöntemini geçersiz kıl

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

Aramak startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);FragmentA.Java'dan

finish();SecondActivity.java'da çağrı yöntemi

Umarım bu işe yarar.


Bu en iyi cevap. Manifest'te "launchMode" un tanımlanması detayı çok önemlidir.
Pablo Insua

5

Biz diyebiliriz startActivityForResult()Sen çağırmalıdır Yani Fragment doğrudan this.startActivityForResult(i, 1);yerinegetActivity().startActivityForResult(i, 1);

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

Etkinlik, Etkinlik Sonucunu Parçanıza gönderir.


1

Cevap için geç olsun. Ancak herkes için yararlı olacaktır.

Benim durumumda Fragment'tan etkinliği çağırmak ve parçayı geri ayarlayın.

Fragment Like getContext kullandım.

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

Sonucu Parçadan Ayarla

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

Şimdi Fragmanla Sonuç Almak

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

    }
}

0

MAinActivity'nin onActivityResult () yöntemi, Fragement öğesinin onActivityResult () yöntemini çağırır, çünkü fragman Aktiviteye yerleştirilir, bu yüzden açıkça MainActivity'ye geri döner



-6

çağrınızı onActivityresult()ParentActivity içinde.


@URAndroid cevap için teşekkürler, ama çözüm var. Çözümünüz mükemmel değil. İyi programlama değil.
Bay Roshan Pawar

Bu aslında bir değil önerilir.
Lo-Tan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.