onActivityResult Fragment içinde çağrılmıyor


877

Bu parçayı barındıran etkinlik onActivityResult, kamera etkinliği döndüğünde çağrılır.

Parçam, kameranın resim çekmesi için gönderilen niyetle sonuç için bir etkinlik başlatır. Resim uygulaması iyi yüklenir, resim çeker ve geri döner. onActivityResultAncak isabet asla. Kesme noktaları ayarladım, ancak hiçbir şey tetiklenmiyor. Bir parça olabilir onActivityResultmi? Bence sağlanan bir işlev olduğu için. Bu neden tetiklenmiyor?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 ) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
    }
}

2
bu gönderiyi kontrol et, sorun açıklaması ve genel çözüm çözümü var: stackoverflow.com/questions/6147884/…
Oleksii K.

5
Bunu okuyan herhangi biri geçtiğinizden emin olun requestCode >= 0!
Muhammad Babar

3
Ayrıca Activity LauchMode cihazınızın singleInstance veya singleTask olmamasına dikkat edin. aksi halde onActivityResult çağrılmaz
Jawad Zeb


Aktivitedeki onActivityResult öğesini Parçaya yönlendirmeliyiz. Bu bağlantıya bakın: codexpedia.com/android/…
Reejesh PK

Yanıtlar:


1239

Barındırma etkinliği geçersiz kılar onActivityResult(), ancak super.onActivityResult()işlenmemiş sonuç kodları için bir çağrı yapmadı . Görünüşe göre, startActivityForResult()çağrı yapan parça olsa bile , aktivite sonucu ele alırken ilk atışı yapar. Bu, parçaların modülerliğini düşündüğünüzde anlamlıdır. Ben hayata kez super.onActivityResult()tüm işlenmeyen sonuçlar için, parça sonucunu taşıma şansları çok.

Ve ayrıca @siqing cevabından:

Parçanızda sonuç almak için, parçanızın içinde startActivityForResult(intent,111);değil, aradığınızdan emin olun getActivity().startActivityForResult(intent,111);.


34
Etkinliğinizin onActivityResult öğesinde super.onActivityResult ()
Spidy

167
@StErMi Parçanızdan getActivity (). StartActivityForResult () öğesini çağırdığınızdan emin olun. Aşağıdaki siqing cevabına bakınız.
OferR

8
Destek kitaplığı kullanılıyor ilgili hata, olduğu görülmektedir code.google.com/p/android/issues/detail?id=15394
Ollie C

82
Ayrıca, iç içe geçmiş parçalar kullanıyorsanız getParentFragment().startActivityForResult, üst parçanın onActivityResult yönteminin çağrılması için alt parçanın çağırması gerektiğini unutmayın .
Eric Brynsvold

7
@EricBrynsvold haklıydı, startActivityForResult iç içe parçalarda çalışmaz. Bunun için getParentFragment (). StartActivityForResult () öğesini çağırmanız daha iyi olur ve bu üst parçada onActivityResult () öğesini uygulayabilirsiniz ve bu yöntemde sonucu alt parçalara teslim edebilirsiniz, örneğin: childFragment.getParentFragment (). onActivityResult (requestCode, sonuçKodu, veri)
edrian

328

Bence aradın getActivity().startActivityForResult(intent,111);. Aramalısın startActivityForResult(intent,111);.


3
Ben de aynı problem vardı RingtonePreferencebulunan PreferenceFragment. Ne yazık ki, RingtonePreferencearamalar getActivity().startActivityForResult(), ve ben super.onActivityResultfaaliyetin aramasına rağmen sonuç alamadım onActivityResult. RingtonePreferenceKendisini PreferenceFragmentve çağrılarına bağlayan sınıftan türetilmiş bir şey yaratmak zorunda kaldım fragment.startActivityForResult().
Stan

@siqing Statik yöntemimden startActivitForResult öğesini çağıramıyorum. Bunun için bir çözüm var mı? Activity.startActivityForResult kullanmam gerekiyor. Lütfen bana bu konuda yardım
Shreyash Mahajan

269

Seçenek 1:

Eğer startActivityForResult()parçayı çağırıyorsanız startActivityForResult(), değil getActivity().startActivityForResult()onActivityResult () parçasına neden olacağı için değil , çağırmalısınız .

Nerede aradığınızdan startActivityForResult()ve yöntemleri nasıl arayacağınızdan emin değilseniz .

Seçenek 2:

Etkinlik sonucu aldığından, onActivityResult()etkinliklerin geçersiz kılınması ve işlenmemiş sonuç kodları veya herkes için ilgili parçaya yayılması için onActivityResult()çağrı yapmanız gerekir super.onActivityResult().

Yukarıdaki iki seçenek işe yaramazsa, kesinlikle işe yarayacağından seçenek 3'e bakın.

Seçenek 3:

Parçadan onActivityResult işlevine yapılan açık çağrı aşağıdaki gibidir.

Üst Activity sınıfında, onActivityResult () yöntemini geçersiz kılın ve hatta Fragment sınıfında aynı şeyi geçersiz kılın ve aşağıdaki kodla çağırın.

Üst sınıfta:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
}

Çocuk sınıfında:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // In fragment class callback
}

4
Bu benim için çalıştı. Bu kötü bir çözüm, ama bu aptalca hatayı çözmek için daha iyi bir fikrim yok ...
Bogdan Zurac

@Vivky, Cevabın benim için çalıştı. Ama karşılaştığım bir sorun daha var, bunun yerine setResult(); finish();ikinci aktiviteden geri döndüğümde, aynı zamanda onActivityResultsağlananla da çağrılıyor RESULT_CODE.
snehal_penurkar

mükemmel cevap. Bunu yapmak için üçüncü çözümü uyguladım.
Sash_KP

Çözüm 3 benim için işe yarayacağını düşünüyorum ama onActivityResult()faaliyetin requestCodeparçası benim garip geçti ve sonra gözardı = =
E-Kami

1
@notGeek Haklısınız. Parça ya da etkinlikten çağrılmış olsanız bile sonuç her zaman Etkinlik'te alınır.
Vinayak

83

Etkinliğinizdeki fragmanları bilmiyorsanız, hepsini sıralayın ve etkinlik sonucu bağımsız değişkenleri gönderin:

// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

3
Lanet olsun, en basit çözümü bulduğumu sanıyordum, ancak getFragments () gibi bir yöntem yok.
WindRider

2
@WindRider var. Android destek kitaplığı (AppCompat) kullanıyorsanız.
dasar

2
Ayrıca, dizideki parçanın kendisine bir referans olmadığını kontrol etmek zorunda zor yolunu öğrendim! `if (fragment! = this) {fragment.onActivityResult (requestCode, sonuçKodu, veri); ``
reubenjohn

Yalnızca üstteki parça listede olacağından, bu parçalar yuvalanmışsa çalışmaz. Super.onActivityResult () zaten listedeki tüm parçaları üzerinde onActivityResult () çağırıyor inanıyorum, bu yüzden bu fikir gereksizdir.
BeccaP


83

İle aynı sorunu yaşıyorum ChildFragmentManager. Yönetici sonucu yuvalanmış parçaya geçirmez, bunu temel parçanızda manuel olarak yapmanız gerekir.

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, intent);
    }
}

1
Özel bir üye olarak çocuğunuzun Parçası varsa Fragment fragment = myChildFragment;, yukarıdaki findFragmentByTagkod satırını değiştirmek için kullanın . Gerisi değişmeden tutulabilir.
LCN

7
Sanırım bir parçayı özel üye olarak tutmamanızı şiddetle tavsiye ederim. Onlar kendi yaşam döngüsü var, bu yüzden asla bilemezsiniz onların etkileşim için iyi bir durumda, Yöneticisi yapar. Ayrıca oldukça ağırlar ve bellek sızıntılarından endişe ediyorum. Kullanmanız gerekmiyorsa yönetici oluşturulmazdı.
MinceMan

67

Orijinal gönderi.

FragmentActivitydeğiştirilmiş requestCodeolan ile değiştirilir. Bundan sonra, ne zaman onActivityResult()çağrılır, FragmentActivitydaha yüksek 16 biti ayrıştırır ve orijinal Parçanın dizinini geri yükler. Şu şemaya bakın:

Resim açıklamasını buraya girin

Kök seviyesinde birkaç parçanız varsa sorun yoktur. Ancak iç içe geçmiş parçalarınız varsa , örneğin Fragmentiçinde birkaç sekme ViewPagervarsa , bir sorunla karşılaşacağınızı garanti edersiniz karşılaşacağınızı (veya zaten karşılaştığınızı) .

Çünkü içeride sadece bir dizin saklanır requestCode. Bu Fragmentonun içindeki indeks FragmentManager. İç içe geçmiş parçalar kullandığımızda FragmentManager, kendi Parçalar listesine sahip olan çocuk var. Bu nedenle, tüm endeks zincirini kökten başlayarak kurtarmak gerekir FragmentManager.

Resim açıklamasını buraya girin

Bu sorunu nasıl çözeriz? Bu yayında ortak bir geçici çözüm var .

GitHub: https://github.com/shamanland/nested-fragment-issue


Sekmeler gibi diğer parçaları tutan üst parça bir ViewPager kullanılan aynı sorun var. İç içe-parça sorunu kullanarak denedim ama derleme hatalar ile sona erdi. Bana çözümü önerebilir misin? Burada da bir sorun çıkardı github.com/shamanland/nested-fragment-issue/issues/2
cgr


Teşekkürler! Önerilen bir çözüm değilse, derleme hatalarını olduğunu bilmek için bunu denemek için zaman harcamanıza gerek kalmaması için cevabı buna göre düzenlemenizi öneririz.
cgr

44

Bu en popüler sorunlardan biridir. Bu konuyla ilgili çok sayıda iplik bulabiliriz. Ama hiçbiri benim için yararlı değil.

Bu sorunu bu çözümü kullanarak çözdüm.

Önce bunun neden olduğunu anlayalım.

startActivityForResultDoğrudan Fragment'tan arayabiliriz , ancak aslında arkadaki mekanik, Aktivite tarafından ele alınır.

Bir startActivityForResultFragment'tan aradığınızda , requestCode, Fragment'ın kimliğini koda ekleyecek şekilde değiştirilir. Bu, Etkinlik'in sonuç alındığında bu isteği kimin göndereceğini izleyebilmesini sağlar.

Etkinlik geri döndüğünde, sonuç, orijinal requestCode + Fragment'ın kimliğine kodu çözülecek değiştirilmiş requestCode ile Activity'nin onActivityResult öğesine gönderilir. Bundan sonra Etkinlik, onActivityResult aracılığıyla Etkinlik Sonucunu bu Fragman'a gönderir. Ve hepsi bitti.

Problem şu:

Etkinlik, sonucu yalnızca doğrudan Etkinliğe eklenmiş ancak iç içe olmayan Fragment'e gönderebilir. OnActivitySorunlanmış parçanın sonucu ne olursa olsun asla çağrılmamasının nedeni budur.

Çözüm:

1) Parçanızdaki Niyeti aşağıdaki kodla başlatın:

       /** Pass your fragment reference **/
       frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345

2) Şimdi Ana Etkinliğinizde geçersiz kılma **onActivityResult() : **

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

Çalışması için bunu ebeveyn etkinliğinde çağırmanız gerekir.

3) Parça aramanızda:

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

       }
}

Bu kadar. Bu çözümle, iç içe olsun ya da olmasın herhangi bir tek parça için uygulanabilir. Ve evet, tüm davayı da kapsıyor! Ayrıca, kodlar da güzel ve temiz.


Ben sadece 'parça' kullanmak zorunda sistem 'aktivite' ile niyet istiyordu.
Uzair

18

BİRÇOK NESTED FRAGMANLAR İÇİN (örneğin, bir parçada ViewPager kullanılırken)

Ana faaliyetinizde :

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

Parçanızda:

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

Yuvalanmış parçanızda

Çağrı etkinliği

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

uniqueInstanceInt - başka bir parçanın cevabı tedavi etmesini önlemek için iç içe parçalar arasında benzersiz bir int ile değiştirin.

Yanıt al

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == uniqueInstanceInt ) {
        // TODO your code
    }
}

Dikkat

UniqueInstanceInt içinde 0 ile 65536 arasında bir sayı kullanılmalıdır. Hata önlemek için "requestCode için yalnızca daha düşük 16 bit kullanılabilir".


Mükemmel biçimde çalışır Aktivite> Fragment (ViewPager)> Fragment
Oleksandr Firsov

14

Birisi hala başaramazsa iki tavsiye ekleyebilirim. Manifest.xml dosyasında, geri arama sırasında barındırma etkinliğinin sona ermediğinden ve başlatılacak etkinliğin standart olarak başlatma moduna sahip olduğundan emin olun. Aşağıdaki gibi ayrıntıları görmek:

Barındırma etkinliği için, varsa geçmiş özelliğini yanlış olarak ayarlayın

android:noHistory="false"

Etkinliğin başlaması için, varsa başlatma modunu standart olarak ayarlayın

android:launchMode="standard"

13

Bir kod dış bloğunu kaydırılmış bir kez aynı sorunu ile karşı karşıya Fragment a Hizmet Sınıfı ile, parentActivityolarak geçirilen bir argüman ,

Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);

Sonra herhangi bir değer elde değildi onActivityResulto yöntemine Fragment , sonra, ben değiştim argümanı için Fragment yönteminin revize tanım benziyordu bu yüzden,

Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);

Bundan sonra, içinde değer elde edebildi onActivityResultüzerinde Parçası


10

Ben de bir Fragment bu sorunla karşılaştım. Ve Aradım startActivityForResultbir de DialogFragment.

Ama şimdi bu sorun çözülene:
FragmentClassname.this.startActivityForResult .


Harika, benim için çalıştı, çünkü startActivityForResult(...)parçanın kodunun içindeki soyut bir sınıftan arıyordum .
Vince

9

NESTED FRAGMENTS İÇİN (örneğin, bir ViewPager kullanırken)

Ana faaliyetinizde:

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

Ana üst düzey parçanızda (ViewPager parçası):

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
    frag.yourMethod(data);  // Method for callback in YourFragment
    super.onActivityResult(requestCode, resultCode, data);
}

Parçanızda (iç içe geçmiş parça):

public void yourMethod(Intent data){
    // Do whatever you want with your data
}

8

Benim durumumda bu bir Android hata (oldu http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/ Desteklenen kullanmak durumunda) FragmentActivitykullanmak zorunda getSupportFragmentManageryerine getChildFragmentManager:

List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
    for (Fragment fragment : fragments) {
        if(fragment instanceof UserProfileFragment) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}

6

Kısacası,

Parça halinde beyan Fragment fragment = this;

bu kullanımdan sonra fragment.startActivityForResult.

Sonuç activityResult içinde döndürülür.


6

Çözüm 1:

startActivityForResult(intent, REQUEST_CODE);Bunun yerine arayın getActivity().startActivityForResult(intent, REQUEST_CODE);.

Çözüm 2:

Ne zaman startActivityForResult(intent, REQUEST_CODE);aktivitenin onActivityResult(requestCode,resultcode,intent)çağrılır çağrılır ve sonra fragments onActivityResult()buradan geçerek çağrı yapabilirsiniz requestCode, resultCode and intent.


5

Parçanızın içinde arayın

this.startActivityForResult(intent, REQUEST_CODE);

burada thisfragmanı kastedilmektedir. Aksi takdirde @Clevester'in dediği gibi yapın:

Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);

Ayrıca aramak zorunda kaldım

super.onActivityResult(requestCode, resultCode, data);

ebeveyn aktivitelerinde onActivityResultçalışmasını sağlamak.

(Bu cevabı @ Clevester'ın cevabından uyarladım.)


5

Kullananlar için Android Navigasyon Bileşen Etkinlik en kullanmanız gereken almak için bu parça referans ve çağrı fragmanı sorunu oluronActivityResult(...)primaryNavigationFragmentfragment.onActivityResult(...) .

Etkinlik adlı kullanıcının faaliyetleri onActivityResult(...)

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

    for (Fragment fragment : getSupportFragmentManager().getPrimaryNavigationFragment().getChildFragmentManager().getFragments())
    {
            fragment.onActivityResult(requestCode, resultCode, imageData);
    }
}

4

Bu yanıtların çoğu, super.onActivityResult(...)sunucunuz ActivityiçinFragment . Ama bu benim için işe yaramıyordu.

Yani, ev sahibinde bunun yerine Activityaramalısınız Fragments onActivityResult(...). İşte bir örnek.

public class HostActivity extends Activity {

    private MyFragment myFragment;

    protected void onActivityResult(...) {
        super.onActivityResult(...);
        this.myFragment.onActivityResult(...);
    }
}

Gözlerinde farklı bir noktada HostActivityatamak gerekir kullandığınız. Veya, içinde bir referans tutmak yerine almak için kullanın . Ayrıca, aramayı denemeden önce kontrol edin .this.myFragmentFragmentFragmentManagerFragmentHostActivitynullthis.myFragment.onActivityResult(...);


3
public class takeimage extends Fragment {

    private Uri mImageCaptureUri;
    private static final int PICK_FROM_CAMERA = 1;
    private static final int PICK_FROM_FILE = 2;
    private String mPath;
    private ImageView mImageView;
    Bitmap bitmap = null;
    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.activity_send_image, container, false);
        final String[] items = new String[] { "From Camera", "From SD Card" };
        mImageView = (ImageView)view.findViewById(R.id.iv_pic);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, items);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select Image");

        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                if (item == 0) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File file = new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"
                        + String.valueOf(System.currentTimeMillis())
                        + ".jpg");
                    mImageCaptureUri = Uri.fromFile(file);

                    try {
                        intent.putExtra(
                            android.provider.MediaStore.EXTRA_OUTPUT,
                            mImageCaptureUri);
                        intent.putExtra("return-data", true);

                        getActivity().startActivityForResult(intent,
                            PICK_FROM_CAMERA);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    dialog.cancel();
                } else {
                    Intent intent = new Intent();

                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);

                    getActivity().startActivityForResult(
                        Intent.createChooser(intent,
                            "Complete action using"), PICK_FROM_FILE);
                }
            }
        });
        final AlertDialog dialog = builder.create();

        Button show = (Button) view.findViewById(R.id.btn_choose);
        show.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // Switch the tab content to display the list view.
                dialog.show();
            }
        });

    return view;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode != Activity.RESULT_OK)
            return;

        if (requestCode == PICK_FROM_FILE) {
            mImageCaptureUri = data.getData();
            // mPath = getRealPathFromURI(mImageCaptureUri); //from Gallery

            if (mPath == null)
                mPath = mImageCaptureUri.getPath(); // from File Manager

            if (mPath != null)
                bitmap = BitmapFactory.decodeFile(mPath);
        } else {
            mPath = mImageCaptureUri.getPath();
            bitmap = BitmapFactory.decodeFile(mPath);
        }
        mImageView.setImageBitmap(bitmap);  
    }

    public String getRealPathFromURI(Uri contentUri) {
        String [] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery(contentUri, proj, null, null,null);

        if (cursor == null) return null;

        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
} 

3
  1. Sadece BaseActivity geçersiz kılabilirsiniz onActivityResultfragmanı üzerinde baseActivity.startActivityForResult.

  2. BaseActivity'de arabirim ekleyin ve onActivityResult'u geçersiz kılın.

    private OnBaseActivityResult baseActivityResult;
    public static final int BASE_RESULT_RCODE = 111;
    public interface OnBaseActivityResult{
        void onBaseActivityResult(int requestCode, int resultCode, Intent data);
       }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){
        getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data);
        setBaseActivityResult(null);
    }
  3. On Fragment aletleri OnBaseActivityResult

    @Override
    public void onBaseActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("RQ","OnBaseActivityResult");
    if (data != null) {
        Log.d("RQ","OnBaseActivityResult + Data");
        Bundle arguments = data.getExtras();
      }
    }

Bu geçici çözüm işinizi görecektir.


3

Yukarıdaki sorun Facebook girişinde karşılaşılıyorsa, parçanızın bir üst etkinliğinde aşağıdaki kodu kullanabilirsiniz:

Fragment fragment = getFragmentManager().findFragmentById(android.R.id.tabcontent);
fragment.onActivityResult(requestCode, resultCode, data);

Veya:

Fragment fragment = getFragmentManager().findFragmentById("fragment id here");
fragment.onActivityResult(requestCode, resultCode, data);

Ve parçanıza aşağıdaki çağrıyı ekleyin ...

callbackManager.onActivityResult(requestCode, resultCode, data);

2

Diğer yanıtlarda henüz açıklanmayan bir başka kullanım durumu:

onActivityResult()fragmanda bildirilenler kullanılırken çağrılmaz exception.startResolutionForResult():

if (exception is ResolvableApiException) {
    exception.startResolutionForResult(activity!!, MY_REQUEST_CODE)
}

Bu durumda exception.startResolutionForResult(), parçanın parçalarıyla değiştirin startIntentSenderForResult():

if (exception is ResolvableApiException) {
    startIntentSenderForResult(exception.resolution.intentSender, MY_REQUEST_CODE, null, 0, 0, 0, null)
}

2

Kotlin sürümü (AcactivityResult () üzerindeki etkinliğinizde)

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    //add following lines in your activity
    if(supportFragmentManager?.fragments!=null && supportFragmentManager?.fragments!!.size>0)
     for (i in 0..supportFragmentManager?.fragments!!.size-1) {
         val fragment= supportFragmentManager?.fragments!!.get(i)
         fragment.onActivityResult(requestCode, resultCode, data)
    }
 }


1

Buradaki tüm cevapların korsanlardan başka bir şey olmadığı konusunda güçlü bir şüphem var. Hepsini ve daha birçoklarını denedim, ancak güvenilir bir sonuç olmadan her zaman aptalca bir sorun var. Biri için tutarsız sonuçlara dayanamıyorum. Fragments için resmi Android API dokümanlarına bakarsanız Google'ın aşağıdakileri açıkça belirttiğini göreceksiniz:

Parçanın içerdiği Etkinlik'ten startActivityForResult (Intent, int) öğesini çağırın.

Görmek: Android Parça API'sı

Bu nedenle, en doğru ve güvenilir yaklaşımın aslında barındırma etkinliğinden startActivityForResult () öğesini çağırmak ve aynı zamanda ortaya çıkan onActivityResult () yöntemini oradan ele almak gibi görünecektir .


2
Ben "Aktivite startActivityForResult ara" bir öneri olduğunu sanmıyorum. Fragment temel sınıfındaki uygulamaya bakarsanız, tüm yaptığı şey budur mActivity.startActivityFromFragment(this, intent, requestCode)- bu yüzden kolaylık
sarıcıdan

1

Kodunuzda iç içe geçmiş bir parça var. Super.onActivityForResult çağrısı çalışmıyor

Parçanızın çağırılabileceği her etkinliği değiştirmek ve veya fragman zincirindeki her parçayı çağırmak için geçici bir çözüm bulmak istemezsiniz.

İşte birçok çalışma çözümünden biri. anında bir parça oluşturun ve destek parçası yöneticisi ile doğrudan etkinliğe bağlayın. Ardından yeni oluşturulan parçadan startActivityForResult öğesini çağırın.

private void get_UserEmail() {

    if (view == null) {
        return;
    }
    ((TextView) view.findViewById(R.id.tvApplicationUserName))
            .setText("Searching device for user accounts...");

    final FragmentManager fragManager = getActivity().getSupportFragmentManager();

    Fragment f = new Fragment() {
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            startActivityForResult(AccountPicker.newChooseAccountIntent(null, null,
                    new String[]{"com.google"}, false, null, null, null, null), REQUEST_CODE_PICK_ACCOUNT);
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode,
                                     Intent data) {
            if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
                String mEmail = "";
                if (resultCode == Activity.RESULT_OK) {
                    if (data.hasExtra(AccountManager.KEY_ACCOUNT_NAME)) {
                        mEmail = data
                                .getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                    }
                }
                if (mActivity != null) {
                    GoPreferences.putString(mActivity, SettingApplication.USER_EMAIL, mEmail);
                }
                doUser();
            }
            super.onActivityResult(requestCode, resultCode, data);
            fragManager.beginTransaction().remove(this).commit();
        }
    };
    FragmentTransaction fragmentTransaction = fragManager
            .beginTransaction();
    fragmentTransaction.add(f, "xx" + REQUEST_CODE_PICK_ACCOUNT);
    fragmentTransaction.commit();
}

Bu gerçekten işe yarıyor ve bunun için sadece bir oyum var. Anında bir parça oluşturun. Çok kolay ama gerçek çalışma çözümü. Birisi benim için düzenlemeye bile çalıştı.
danny117

1

Sorunum Host etkinliği ile oldu Ben android:launchMode="standard"geçici bir kaldırıldı bir set ile buldum bir iş!


1

Kimsenin sahip olmadığı bir nokta mention, Ana Bilgisayar Etkinliği başlatma modunuzunsingleInstance veya olarak ayarlanmamasını sağlamaktır singleTask.

Başlatma modunuz SingleInstance veya SingleTask olarak ayarlanmışsa onActivityResult çalışmaz. veya bu IntentFilters'ı kullanarak etkinliğinizi çağırırsınız

standardveya singleTopbaşlatma modu iyi çalışır.


1

İç içe fragmanlar kullanıyorsanız, bu da işe yarıyor:

getParentFragment().startActivityForResult(intent, RequestCode);

Buna ek olarak super.onActivityResult, üst aktiviteden çağırmanız onActivityResultve parçanın yöntemini doldurmanız gerekir .


1

Ben uzanan bir temel sınıf yazarak konuyu ele sahip Fragmentve içinde onactivityresultkullanıyorum şu anda çalışan bir kısmını belirlemiştir faaliyet fragmenttag. Sonra fragmentbase sınıfında kullanıcı tanımlı bir yöntem çağırıyorum. Bu, o anda çalışan parçada bir olayı tetikleyecektir.

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.