web-dev-qa-db-fra.com

onActivityResult n'est pas appelé dans Fragment

L'activité hébergeant ce fragment a sa onActivityResult appelée au retour de l'activité de la caméra.

Mon fragment commence une activité pour un résultat avec l'intention envoyée à l'appareil photo de prendre une photo. L'application Image se charge très bien, prend une photo et revient. La onActivityResult n'est cependant jamais touchée. J'ai défini des points d'arrêt, mais rien n'est déclenché. Un fragment peut-il avoir onActivityResult? Je pense que oui puisque c'est une fonction fournie. Pourquoi cela n'est-il pas déclenché?

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);
    }
}
811
Spidy

L’activité d’hébergement a priorité sur onActivityResult(), mais elle n’a pas fait appel à super.onActivityResult() pour les codes de résultat non gérés. Apparemment, même si le fragment est celui qui appelle startActivityForResult(), l'activité est la première à traiter le résultat. Cela a du sens quand on considère la modularité des fragments. Une fois que j’ai implémenté super.onActivityResult() pour tous les résultats non gérés, le fragment a eu l’opportunité de gérer le résultat.

Et aussi de @siqing répondre:

Pour obtenir le résultat dans votre fragment, appelez startActivityForResult(intent,111); au lieu de getActivity().startActivityForResult(intent,111); dans votre fragment.

1172
Spidy

Je pense que vous avez appelé getActivity().startActivityForResult(intent,111);. Vous devriez appeler startActivityForResult(intent,111);.

315
siqing

Option 1:

Si vous appelez startActivityForResult() à partir du fragment, vous devez appeler startActivityForResult() et non pas getActivity().startActivityForResult(), car cela produira un fragment onActivityResult ().

Si vous ne savez pas exactement où vous appelez sur startActivityForResult() et comment vous allez appeler des méthodes.

Option 2:

Puisque Activity obtient le résultat de onActivityResult(), vous devez remplacer le onActivityResult() de l'activité et appeler super.onActivityResult() pour se propager au fragment correspondant pour les codes de résultats non gérés ou pour tous.

Si les deux options ci-dessus ne fonctionnent pas, reportez-vous à l'option 3 car elle fonctionnera définitivement.

Option 3:

Un appel explicite de fragment à la fonction onActivityResult est le suivant.

Dans la classe Activité parent, remplacez la méthode onActivityResult () et même la même chose dans la classe Fragment et appelez-la comme code suivant.

Dans la classe parente:

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

Dans la classe enfant:

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

J'ai le même problème avec le ChildFragmentManager. Le gestionnaire ne transmettra pas le résultat au fragment imbriqué, vous devez le faire manuellement dans votre fragment de base.

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);
    }
}
79
MinceMan

Si vous ne connaissez pas les fragments de votre activité, il suffit de les énumérer et d'envoyer les arguments de résultat d'activité:

// 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);
    }
}
79
ruX

Message original.

FragmentActivity remplace requestCode par un nom modifié. Ensuite, lorsque onActivityResult() sera appelé, FragmentActivity analyse les 16 bits les plus élevés et restaure l'index du fragment d'origine. Regardez ce schéma:

Enter image description here

Si vous avez quelques fragments au niveau racine, il n'y a pas de problèmes. Mais si vous avez des fragments imbriqués , par exemple Fragment avec quelques onglets à l'intérieur de ViewPager, vous garanti sera confronté à un problème (ou y a déjà fait face).

Parce que , un seul index est stocké à l'intérieur de requestCode. C'est l'index de Fragment à l'intérieur de son FragmentManager. Lorsque nous utilisons des fragments imbriqués, il existe des enfants FragmentManagers, qui ont leur propre liste de fragments. Il est donc nécessaire de sauvegarder toute la chaîne d’index, à partir de la racine FragmentManager.

Enter image description here

Comment résoudre ce problème? Il existe une solution commune pour contourner le problème dans cet article .

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

57
Oleksii K.

C'est l'un des problèmes les plus populaires. Nous pouvons trouver beaucoup de discussions sur ce problème. Mais aucun d'entre eux n'est utile pour moi.

J'ai donc résolu ce problème en utilisant cette solution.

Comprenons d'abord pourquoi cela se produit.

Nous pouvons appeler startActivityForResult directement à partir de Fragment mais, en réalité, les mécanismes derrière sont tous traités par activité.

Une fois que vous appelez startActivityForResult depuis un fragment, requestCode sera modifié pour attacher l'identité du fragment au code. Cela permettra à Activity de retracer ceux qui envoient cette demande une fois le résultat reçu.

Une fois l'activité retrouvée, le résultat sera envoyé à onActivityResult d'Activity avec le requestCode modifié qui sera décodé en identifiant le requestCode + identité d'origine du fragment. Après cela, Activity enverra le résultat de l'activité à ce fragment via onActivityResult. Et tout est fait.

Le problème est:

Activity peut envoyer le résultat uniquement au fragment qui a été attaché directement à Activity mais pas au fragment imbriqué. C'est la raison pour laquelle onActivityResult of fragment imbriqué n'a jamais été appelé, quoi qu'il arrive.

Solution:

1) Commencez l’intention dans votre fragment par le code ci-dessous:

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

2) Dans votre activité parent, remplacez ** onActivityResult(): **

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

Vous devez appeler cela dans l'activité parent pour que cela fonctionne.

) Dans votre fragment appel:

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

       }
}

C'est ça. Avec cette solution, il pourrait être appliqué à n'importe quel fragment, qu'il soit imbriqué ou non. Et oui, cela couvre aussi tous les cas! De plus, les codes sont aussi gentils et propres.

42
KishuDroid

POUR DE NOMBREUX FRAGMENTS CONSACRÉS (par exemple, lors de l'utilisation d'un ViewPager dans un fragment)

dans votre activité principale:

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

Dans votre fragment:

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

Dans votre fragment imbriqué

Activité d'appel

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

uniqueInstanceInt - remplacez-le par un entier unique parmi les fragments imbriqués afin d'éviter qu'un autre fragment ne traite la réponse.

Recevoir une réponse

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

Attention

Un nombre compris entre 0 et 65536 doit être utilisé dans uniqueInstanceInt pour éviter les erreurs "Ne peut utiliser que les 16 bits inférieurs pour le code de requête".

18
Luciano Marqueto

Je peux ajouter deux conseils si quelqu'un ne peut toujours pas le faire. Dans le fichier Manifest.xml, assurez-vous que l'activité d'hébergement ne s'est pas terminée au rappel et que l'activité à démarrer a le mode de lancement par défaut. Voir les détails ci-dessous:

Pour l'activité Hébergement, définissez la propriété no history sur false si have

Android:noHistory="false"

Pour que l’activité démarre, définissez le mode de lancement en standard si

Android:launchMode="standard"
14
jowett

Je faisais également face au même problème une fois que j'ai déplacé ce bloc de code en dehors d'un fragment vers une classe d'utilitaire , avec parentActivity passé en tant qu'argument ,

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

Ensuite, je n’obtenais aucune valeur dans la méthode onActivityResult de cette méthode fragment, Après, j’ai modifié l’argument en Fragment, donc la définition révisée de la méthode ressemblait à ceci:

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

Après cela, j'ai pu obtenir de la valeur dans onActivityResult sur le Fragment

11

J'ai aussi rencontré ce problème dans un fragment. Et j'ai appelé startActivityForResult dans un DialogFragment.

Mais maintenant, ce problème a été résolu:
FragmentClassname.this.startActivityForResult.

10
Courysky

Solution 1:

Appelez startActivityForResult(intent, REQUEST_CODE); au lieu de getActivity().startActivityForResult(intent, REQUEST_CODE);.

Solution 2:

Lorsque startActivityForResult(intent, REQUEST_CODE); est appelée, onActivityResult(requestCode,resultcode,intent) de l'activité est appelée et vous pouvez ensuite appeler fragments onActivityResult() à partir de là, en passant le requestCode, resultCode and intent.

6
Amey Haldankar

Dans mon cas, c’était un bogue Android ( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-Android/ ), si vous utilisez FragmentActivity pris en charge, vous devez utiliser getSupportFragmentManager au lieu de getChildFragmentManager:

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

POUR LES FRAGMENTS INTÉGRÉS (par exemple, lors de l'utilisation d'un ViewPager)

Dans votre activité principale:

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

Dans votre fragment de niveau supérieur principal (fragment ViewPager):

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

Dans YourFragment (fragment imbriqué):

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

Dans votre fragment, appelez

this.startActivityForResult(intent, REQUEST_CODE);

this fait référence au fragment. Sinon, faites comme @Clevester a dit:

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

J'ai aussi dû appeler

super.onActivityResult(requestCode, resultCode, data);

dans onActivityResult de l'activité parente pour le faire fonctionner.

(J'ai adapté cette réponse à partir de la réponse de @ Clevester.)

5
Suragch

En bref,

Dans le fragment, déclarez Fragment fragment = this;

après cela, utilisez fragment.startActivityForResult.

Le résultat reviendra dans activityResult.

5
Clevester

La plupart de ces réponses continuent de dire que vous devez appeler super.onActivityResult(...) dans votre hôte Activity pour votre Fragment. Mais cela n'a pas semblé fonctionner pour moi.

Ainsi, dans votre hôte Activity, vous devez appeler votre FragmentsonActivityResult(...). Voici un exemple.

public class HostActivity extends Activity {

    private MyFragment myFragment;

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

À un moment donné dans votre HostActivity, vous devrez attribuer this.myFragment le Fragment que vous utilisez. Ou bien, utilisez FragmentManager pour obtenir le Fragment au lieu de garder une référence à celui-ci dans votre HostActivity. Vérifiez également que null avant d'essayer d'appeler la this.myFragment.onActivityResult(...);.

4
prolink007
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. Vous pouvez simplement remplacer BaseActivity onActivityResult sur le fragment baseActivity.startActivityForResult.

  2. Sur BaseActivity, ajoutez une interface et remplacez onActivityResult.

    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 implémente 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();
      }
    }
    

Cette solution de contournement fera l'affaire.

3
Khaled Lela

Si le problème ci-dessus est rencontré à identifiant Facebook, vous pouvez utiliser le code ci-dessous dans une activité parent de votre fragment, telle que:

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

ou:

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

Et ajoutez l'appel ci-dessous dans votre fragment ...

callbackManager.onActivityResult(requestCode, resultCode, data);
3
Ketan Patel

Mon problème était lié à l'activité de l'hôte. Je l'ai trouvé avec un ensemble Android:launchMode="standard" je l'ai supprimé temporairement et il fonctionne!

1
Chulo

Si vous utilisez des fragments imbriqués, cela fonctionne également:

getParentFragment().startActivityForResult(intent, RequestCode);

De plus, vous devez appeler super.onActivityResult à partir de l'activité parent et renseigner la méthode onActivityResult du fragment.

1
Oguz Ozcan

Votre code a un fragment imbriqué. L'appel de super.onActivityForResult ne fonctionne pas

Vous ne voulez pas modifier chaque activité à partir de laquelle votre fragment peut être appelé et ne travaillez pas avec l'appel de chaque fragment de la chaîne de fragments.

Voici l'une des nombreuses solutions de travail. créez un fragment à la volée et connectez-le directement à l'activité avec le gestionnaire de fragments de support. Appelez ensuite startActivityForResult à partir du fragment nouvellement créé.

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

Je soupçonne fort que toutes les réponses ici ne sont que des hacks. Je les ai tous essayés et beaucoup d'autres, mais sans conclusion fiable, car il y a toujours une sorte de problème stupide. Pour ma part, je ne peux pas compter sur des résultats incohérents. Si vous consultez la documentation officielle de l'API Android pour Fragments, vous verrez que Google indique clairement ce qui suit:

Appelez startActivityForResult (Intent, int) à partir du fragment contenant l'activité.

Voir: Android Fragment API

Donc, il semblerait que l’approche la plus correcte et la plus fiable serait d’appeler startActivityForResult () à partir de l’hébergement et de gérer également le résultat onActivityResult () à partir de là.

1
Chris

Comme mentionné par Ollie C, il existe un bogue actif pour la bibliothèque de support utilisant les valeurs renvoyées à onActivityResult lorsque vous utilisez des fragments imbriqués. Je viens de frapper : .

Voir --- (Fragment.onActivityResult non appelé lorsque requestCode! =.

1
chaqke

Je viens de faire une méthode de contournement:

public static Fragment _tempFragment = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(_tempFragment != null)
        _tempFragment.onActivityResult(requestCode, resultCode, data);
}

Dans votre fragment, avant startActivityResult, définissez

MainActivity._tempFragment = this;

Après onActivityResult <- in Fragment

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

     // Do your job
     {

     }
     MainActivity._tempFragment = null;
}
0
Ah Lam

Un autre cas d’utilisation non décrit dans d’autres réponses:

onActivityResult() déclaré dans le fragment n'est pas appelé lors de l'utilisation de exception.startResolutionForResult():

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

Dans ce cas, remplacez exception.startResolutionForResult() par le startIntentSenderForResult() du fragment:

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

Utilisez simplement le code ci-dessous pour le fragment.

@Override
public void onOtherButtonClick(ActionSheet actionSheet, int index) {

    if (index == 1)
    {
        Intent intent = new Intent(Intent.ACTION_PICK,
                                   Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent,
                                                    "Select Picture"), 1);
     }
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == 1) {
        if (requestCode == 1) {
            Uri selectedImageUri = data.getData();
            //selectedImagePath = getPath(selectedImageUri);
        }
    }
}

onActivityResult appellera sans appeler son parent.

0
Kirtikumar A.

Une des méthodes les plus simples consiste à démarrer une activité à partir de votre fragment.

startActivity(ActivityName);

Ensuite, ajoutez votre appel startActivityForResult(intent,"1"); à partir de votre activité et ajoutez onActivityResult à votre activité.

startActivityForResult(intent,"1");

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
// perform other activity result like fetching from Uris or handling cursors

finish(); // finish the activity will  get to back to your fragment.
}
0
Rohit Goyal

Version Kotlin (Dans votre activité onActivityResult ())

 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)
    }
 }
0
Ranjith Kumar

Un point sur lequel personne n'a mention et qui s'assure que votre activité hôte mode de lancement ne doit pas être défini sur singleInstance ni singleTask.

onActivityResult ne fonctionnera pas si votre mode de lancement est défini sur SingleInstance ou SingleTask. ou vous appelez votre activité avec ces IntentFilters

standard ou singleTop le mode de lancement fonctionnera correctement.

0
Xar E Ahmer

S'il y a un problème avec la méthode onActivityResult qui se trouve dans la classe fragment et que vous souhaitez mettre à jour quelque chose qui se trouve également dans la classe fragment, utilisez:

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

    if(resultCode == Activity.RESULT_OK)
    {
        // If the user had agreed to enabling Bluetooth,
        // populate the ListView with all the paired devices.
        this.arrayDevice = new ArrayAdapter<String>(this.getContext(), R.layout.device_item);
        for(BluetoothDevice bd : this.btService.btAdapater.getBondedDevices())
        {
            this.arrayDevice.add(bd.getAddress());
            this.btDeviceList.setAdapter(this.arrayDevice);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

Ajoutez simplement le this.variable comme indiqué dans le code ci-dessus. Sinon, la méthode sera appelée dans l'activité parente et la variable ne sera pas mise à jour de l'instance actuelle.

Je l'ai également testé en plaçant ce bloc de code dans la MainActivity, en remplaçant this par la classe HomeFragment et en ayant les variables statiques. J'ai eu des résultats comme je m'y attendais.

Donc, si vous voulez que la classe fragment ait sa propre implémentation de onActivityResult, l'exemple de code ci-dessus est la solution.

0

J'ai traité le problème en écrivant une classe de base qui étend Fragment, et dans onactivityresult de l'activité, j'ai identifié le fragment en cours d'exécution à l'aide de fragmenttag. Ensuite, j'appelle une méthode définie par l'utilisateur dans la classe fragmentbase. Cela déclenchera un événement dans le fragment en cours d'exécution.

0
Bytecode