2012-01-12 3 views
27

J'ai un problème avec l'importation d'une image de l'album dans Android, car la méthode onActivityResult() n'est jamais appelée.onActivityResult() non appelé lorsque l'activité a démarré à partir du fragment

C'est le code que j'ai écrit (appelé à partir d'un fragment non une activité):

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
getActivity().startActivityForResult(galleryIntent, PICK_IMAGE); 

Et par ailleurs, je l'ai défini le onActivityResult(), mais il n'a jamais déclenché:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG, "onActivityResult"); // not printed 
} 

Une idée de ce qui ne va pas avec ça?

Merci!

+3

constructeur ajouter, super.onActivityResult (requestCode, resultCode, données); – Venky

+0

J'ai édité la question, en effet mon code a déjà cette ligne. –

+0

Vous devez sélectionner l'image de la galerie droite? – Venky

Répondre

111

Pour avoir onActivityResult() appelé dans le fragment, vous devez appeler la version de startActivityForResult() du fragment, pas l'activité de. Ainsi, dans le code de votre fragment, remplacez

getActivity().startActivityForResult(galleryIntent, PICK_IMAGE); 

avec

startActivityForResult(galleryIntent, PICK_IMAGE); 
+8

Si facile de faire cette erreur lors de la conversion des activités en fragments :-) – Kuffs

+2

WOW a travaillé :) sympa, nous utilisons toujours getActivity() en fragments :) aidez-moi beaucoup – Javier

+1

cela devrait être la bonne réponse, l'autre méthode d'appeler une méthode à l'intérieur de votre fragment est une solution de contournement – irwinb

-2

Essayez cette Snippet:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); 
    intent.setType("image/*"); 
    intent.putExtra("return-data", true); 
    startActivityForResult(intent, 1); 


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

     case 1: 
      if(requestCode == 1 && data != null && data.getData() != null){ 
       Uri _uri = data.getData(); 

       if (_uri != null) { 
        Cursor cursor = getContentResolver().query(_uri, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null); 
        cursor.moveToFirst(); 
        final String imageFilePath = cursor.getString(0); 
        File photos= new File(imageFilePath); 
        imageView.setImageBitmap(bitmap); 
        cursor.close(); 
       } 
      } 
      super.onActivityResult(requestCode, resultCode, data); 
     } 
    } 
+6

pourquoi appelez-vous "super.onActivityResult (requestCode, resultCode, data);" deux fois ??! –

16

Avec ce code:

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
getActivity().startActivityForResult(galleryIntent, PICK_IMAGE); 

Le onActivityResult doit être l'activité qui contient le fragment. De là, vous pouvez appeler n'importe quelle méthode du fragment, pas dans le fragment.

MyFragment myFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment); 
myFragment .onCameraResult(requestCode, resultCode, intent); 

pour y faire tout ce que vous voulez

+1

Je ne peux pas croire que je ne l'ai pas vu avant! Merci :) –

Questions connexes