2012-05-12 37 views
193

estoy empezando una nueva actividad de mi Fragmento conrequestCode mal en onActivityResult

startActivityForResult(intent, 1); 

y quiere gestionar el resultado en la actividad del fragmento padres:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode); 
    if (requestCode == 1) { 
     // bla bla bla 
    } 
} 

El problema es que nunca Obtuve el requestCode que acabo de publicar en startActivityForResult(). Obtuve algo como 0x40001, 0x20001, etc. con un conjunto de bits aleatorio mayor. Los documentos no dicen nada sobre esto. ¿Algunas ideas?

+0

posible duplicado de [onActivityResult no ser llamado en el fragmento] (http://stackoverflow.com/questions/6147884/onactivityresult- not-being-called-in-fragment) – PhoneixS

Respuesta

566

Está llamando al startActivityForResult() desde su Fragment. Cuando hace esto, el requestCode se cambia por el Activity que posee el Fragment.

Si usted quiere conseguir la correcta resultCode en su actividad a probar esto:

Cambio:

startActivityForResult(intent, 1); 

Para:

getActivity().startActivityForResult(intent, 1); 
+1

El resultado se entrega a la actividad y deseo que se entregue allí. Simplemente tiene el código de solicitud incorrecto. – Dimanoid

+34

Porque debe decidir a qué fragmento entregará el resultado. Entonces cuando The Fragment llama a StartActivityForResult. el Código de solicitud será modificado por la Actividad, por lo que sabrá cómo entregar el resultado a qué fragmento. si realmente quieres obtener el resultado en el Activiy. simplemente llame a getActivity(). startActivityForResult(). –

+0

Gran respuesta. Además, no estoy al 100% pero parece que esto puede ser un error solo con el paquete de soporte: [https://code.google.com/p/android/issues/detail?id=40537](https : //code.google.com/p/android/issues/detail? id = 40537) – matt

5

Si va a proporcionar constante hacerlo público y luego utilizar en startActivityResult

ejemplo:

public static final int REQUEST_CODE =1; 
getActivity().startActivityForresult(intent, REQUEST_CODE); 
15

El código de solicitud no es incorrecto. Cuando se utilizan fragmentos de la biblioteca de soporte v4, el índice de fragmentos se codifica en los 16 bits superiores del código de solicitud y el código de solicitud se encuentra en los 16 bits inferiores. El índice de fragmentos se usa luego para encontrar el fragmento correcto para entregar el resultado.

Por lo tanto para actividades comenzaron forma objeto fragmento manejar onActivityResult requestCode, como a continuación: por ejemplo, puede decodificar esta requestCode como:

originalRequestCode = changedRequestCode - (indexOfFragment < < 16) 6 = 196 614 - (3 < < 16)

+0

Gran información que explica la causa exacta de este problema – Muzikant

+0

pregunta rápida: ¿qué es indexOfFragment? –

+0

indexOfFragment es el índice que getSupportFragmentManager(). GetFragments() produce – HerberthObregon

2

también puede definir
super.onActivityResult(requestCode, resultCode, data)
en Activity (si reemplaza onActivityResult) en este

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

     ... 

     default: 
      super.onActivityResult(requestCode, resultCode, data); 
    } 
} 

y llame startActivityForResult(intent, requestCode) dentro de su Fragment

5

más fácil:

int unmaskedRequestCode = requestCode & 0x0000ffff

de verificación para los 16 bits más bajos, simplemente desenmascararlo haciendo un AND lógico con los 16 bits superiores puestos a cero

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

    final int unmaskedRequestCode = requestCode & 0x0000ffff 

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){ 
     //Do stuff 

    } 
} 
+0

¿Puede decirme el motivo por el que no proporciona el código de solicitud original? –

+1

Causa de que el Código de solicitud es cambiado por la Actividad que posee el Fragmento. Ver respuesta Ashlesha Sharma –

+0

gracias, esta es la respuesta que estaba buscando. No veo por qué Android no debería devolver el código de solicitud original. –

0

en Fragmento

getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST); 

en la actividad principal:

if (requestCode == PLACE_PICKER_REQUEST) { 
      if (resultCode == RESULT_OK) {  
    //what ever you want to do 
      } 
Cuestiones relacionadas