955 votes

onActivityResult ne pas être appelé dans le Fragment

MODIFIER

L'activité d'hébergement de ce fragment a ses onActivityResult appelée lorsque l'activité de la caméra retourne

Mon fragment démarre une activité de résultat avec l'intention envoyé pour l'appareil photo pour prendre une photo. L'image de l'application charge très bien, prend une photo, et les retours. L' onActivityResult cependant n'est jamais atteint. J'ai mis des points de rupture, mais rien n'est déclenchée. Peut un fragment ont onActivityResult? Je pense donc depuis sa une fonction fournie. Réflexions sur pourquoi ce n'est 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);
    }
}

1323voto

Spidy Points 10242

Donc, j'ai compris le problème et nous publierons la réponse de quelqu'un d'autre rencontre ce problème. L'activité d'hébergement l'emportait sur l' onActivityResult mais n'a pas fait un appel à l' super.onActivityResult pour les non gérée codes de résultat. Apparemment, même si le fragment est celui qui fait l' startActivityForResult appel, l'activité devient le premier coup à la manipulation du résultat. Cela fait sens lorsque l'on considère la modularité de fragments. Une fois que j'ai mis en oeuvre super.onActivityResult pour tous les non gérée résultats, le fragment reçu un coup à la manipulation du résultat.

354voto

siqing Points 1229

Je pense que vous avez appelé :``

vous devez appeler :``

a essayer ;

304voto

Happy Vicky Points 761

Option 1 :

Si ur appelant startActivityForResult() de fragment Alors u doit appeler startActivityForResult() pas getActivity().startActivityForResult() entraînera fragment onActivityResult().

Si pas sûr d'où u r appelant startActivityForResult() et comment ur de l'appel de méthodes.

Option 2:

Puisque l'Activité est onActivityResult() résultat ainsi le besoin de remplacer activité, en onActivityResult(), appelez - super.onActivityResult() pour se propager à d'respectifs fragment de non gérée résultats de codes ou pour tous.

Si au-dessus de 2 options ne fonctionne pas, consultez l'option 3 vais certainement travailler.

Option 3 :

Appel explicite fragment onActivityResult fonction comme suit

En Activité Parent de la classe de remplacer onActivityResult() la méthode et la même remplacer le même Fragment de la Classe et de l'appeler comme code suivant.

Dans La Classe Parent:

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

86voto

MinceMan Points 1583

Je vais avoir ce même problème avec le ChildFragmentManager. Le gestionnaire ne passera pas le résultat au fragment imbriqué, vous devez le faire manuellement dans votre fragment de base.

72voto

Oleksii Kropachov Points 1698

Original post.

FragmentActivity remplacer requestCode par modification d'une seule. Après cela, lorsque onActivityResult() sera invoqué, FragmentActivity analyser plus élevée de 16 bits et de restauration de l'indice de Fragment d'origine. Regardez ce schéma:

enter image description here

Si vous avez quelques fragments au niveau de la racine il n'y a pas de problèmes. Mais si vous avez imbriquée fragments, par exemple Fragment avec quelques onglets à l'intérieur d' ViewPager, vous avez la garantie devra faire face à un problème (ou l'ont déjà fait il).

Parce que seul l'index est stocké à l'intérieur d' requestCode. Qui est l'indice d' Fragment à l'intérieur de l' FragmentManager. Lorsque nous utilisant des fragments, il existe des enfants FragmentManager, ce qui est propre liste de Fragments. Donc, il est nécessaire d'enregistrer ensemble de la chaîne des indices, à partir de la racine FragmentManager.

enter image description here

Comment résoudre ce problème? Il est commun de solution de rechange dans ce post.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X