web-dev-qa-db-fra.com

onActivityResult For Fragment

J'ai actuellement une activité de base qui héberge un seul fragment. À l'intérieur du fragment, j'ai une méthode qui démarre le sélecteur de contact.

private void chooseContacts() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK,      ContactsContract.Contacts.CONTENT_URI);
    pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

Lorsque cette activité revient, comment dois-je capturer les résultats. J'ai essayé d'ajouter un

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

à la fois à mon activité de base et au fragment, mais aucune méthode n'est déclenchée. Si possible, je voudrais que le fragment gère le retour afin de ne pas embrouiller l'activité.

Veuillez me faire savoir quelle est la meilleure pratique dans cette situation.

Mise à jour:

si je change:

startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

à

getActivity().startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

alors ça marche, mais d'autres articles m'ont fait penser que c'était incorrect.

34
Nath5

Je pense que vous devriez toujours utiliser l'appel startActivityForResult() directement en fragment, pas utiliser getActivity().startActivityForResult().

J'appelle la startActivityForResult() dans Fragment et implémente la onActivityResult dans Fragment, la onActivityResult() est appelée correctement.

vous ne pouvez pas appeler startActivityForResult() en activité, sinon la onActivityResult() dans Fragment ne sera pas appelée.

52
Zephyr

Dans mon cas, je l'ai fait dans mon activité parentale

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

Cela vous aidera onActivityResult dans Fragments

PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);

Et

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

        if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == Activity.RESULT_OK) {
                Place place = PlacePicker.getPlace(data, getActivity());
             }
         }
}
1

Le onActivityCreated du fragment sert un autre objectif:

Appelé lorsque l'activité du fragment a été créée et la hiérarchie de vues de ce fragment instanciée. Il peut être utilisé pour effectuer l'initialisation finale une fois que ces éléments sont en place, tels que la récupération des vues ou la restauration de l'état. Il est également utile pour les fragments qui utilisent setRetainInstance (booléen) de conserver leur instance, car ce rappel indique au fragment lorsqu'il est entièrement associé à la nouvelle instance d'activité. Ceci est appelé après onCreateView (LayoutInflater, ViewGroup, Bundle) et avant onViewStateRestored (Bundle).

Ceci est extrait de la documentation

Principalement avec un fragment, vous allez gonfler et retourner la vue dans le onCreateView, faire les opérations de vue (comme définir un ListAdapter dans un ListView) dans le onViewCreated. Et effectuez les opérations d'initialisation (comme afficher une boîte de dialogue de bienvenue ou quelque chose comme ça) dans le onActivityCreated.

Vous avez plusieurs choix, je ne suis pas sûr de savoir ce qui convient le mieux à votre problème:

  • Ce que je ferais sera un findFragmentById dans le onActivityResult de l'activité, et si le fragment n'est pas null, exécutez une méthode qui gère le retour de la liste de contacts dans le fragment.

  • Une autre façon de le faire est de déclencher un BroadCastReceiver dans le onActivityResult de l'activité et d'enregistrer votre fragment pour écouter cette diffusion. Mais je pense que c'est trop compliqué pour quelque chose d'aussi simple.

  • Enfin, comme le premier, si vous n'avez pas de fragment avec un id, vous pouvez instancier le fragment dans votre activité, enregistrer une référence et lui envoyer un message lorsque le onActivityResult de l'activité est exécuté .

J'espère que quelque chose de cela vous aidera.

1
4gus71n