2012-01-12 1 views
27

Ho un problema con l'importazione di un'immagine dall'album in Android, perché il metodo onActivityResult() non viene mai chiamato.onActivityResult() non chiamato quando Attività avviata da Frammento

Questo è il codice che ho scritto (chiamato da un non frammento un'attività):

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

E, a proposito, ho definito il onActivityResult() ma non è mai innescato:

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

Qualche idea di cosa c'è che non va in questo?

Grazie!

+3

aggiungere costruttore, super.onActivityResult (requestCode, resultCode, dati); – Venky

+0

Ho modificato la domanda, infatti il ​​mio codice ha già quella linea. –

+0

È necessario selezionare l'immagine dalla galleria giusto? – Venky

risposta

111

Per avere onActivityResult() chiamato nel frammento, si dovrebbe chiamare la versione del frammento di startActivityForResult(), non l'attività di. Così nel codice del frammento, sostituire

getActivity().startActivityForResult(galleryIntent, PICK_IMAGE); 

con

startActivityForResult(galleryIntent, PICK_IMAGE); 
+8

Così facile da fare questo errore durante la conversione di attività in frammenti :-) – Kuffs

+2

WOW ha funzionato :) bello, usiamo sempre getActivity() in frammenti :) aiutami molto – Javier

+1

questa dovrebbe essere la risposta corretta, l'altro metodo di chiamare un metodo all'interno del frammento è una soluzione alternativa – irwinb

-2

Prova questa 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

perché si chiama "super.onActivityResult (requestCode, resultCode, data);" due volte ??! –

16

Con questo codice:

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

L'onActivityResult deve essere in attività che contiene il frammento. Da lì puoi chiamare qualsiasi metodo del frammento, non nel frammento.

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

da fare lì quello che volete

+1

Non posso credere di non averlo visto prima! Grazie :) –