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