working studio startresolutionforresult not example android android-fragments onactivityresult

android - studio - onactivityresult()



Código de solicitud incorrecto en onActivityResult (6)

Estoy empezando una nueva Actividad de mi Fragmento con

startActivityForResult(intent, 1);

y quiere manejar el resultado en la Actividad principal del Fragmento:

@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 startActivityForResult() de startActivityForResult() que acabo de publicar en startActivityForResult() .

0x40001 algo como 0x40001 , 0x40001 , etc. con un conjunto de bits superior aleatorio. Los doctores no dicen nada de esto. ¿Algunas ideas?


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

Por lo tanto, para Actividades iniciadas desde el fragmento de objeto, maneje onActivityResult requestCode como a continuación:

originalRequestCode = changedRequestCode - (indexOfFragment << 16) 6 = 196614 - (3 << 16)


Estás llamando a startActivityForResult() desde tu Fragment . Al hacer esto, el requestCode se modifica por la Activity que posee el Fragment .

Si desea obtener el resultCode correcto en su actividad, intente esto:

Cambio:

startActivityForResult(intent, 1);

A:

getActivity().startActivityForResult(intent, 1);


Si está proporcionando información constante, startActivityResult pública y luego startActivityResult en startActivityResult

ejemplo:

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


También puedes definir
super.onActivityResult(requestCode, resultCode, data)
en Activity (si anula onActivityResult ) en este

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { ... default: super.onActivityResult(requestCode, resultCode, data); } }

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


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 }


Más fácil:

int unmaskedRequestCode = requestCode & 0x0000ffff

Verifique los 16 bits más bajos, simplemente desenmascare 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 } }