Estoy comenzando una nueva Actividad desde mi Fragmento con
startActivityForResult(intent, 1);
y desea 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 recibí el requestCode
que acabo de publicar startActivityForResult()
.
Obtuve algo como 0x40001
, 0x20001
etc. con un conjunto de bits aleatorio más alto. Los documentos no dicen nada sobre esto. ¿Algunas ideas?
android
android-fragments
onactivityresult
Dimanoide
fuente
fuente
Respuestas:
Estás llamando
startActivityForResult()
desde tuFragment
. Cuando haces esto,requestCode
elActivity
que posee el cambia elFragment
.Si desea obtener lo correcto
resultCode
en su actividad, intente esto:Cambio:
A:
fuente
startActivityForResult
un fragmento y espera el resultado deonActivityResult
ese fragmento, solo asegúrese de llamarsuper.onActivityResult
a la actividad del host (en caso de que anule ese método allí). Esto se debe a que la actividadonActivityResult
parece llamar al fragmentoonActivityResult
. Además, tenga en cuenta que el código de solicitud, cuando viaja a través de la actividadonActivityResult
, se modifica como se explica en el enlace que Dimanoid publicó en su respuesta a continuación. Puede que no necesite saber eso, pero nunca se sabe ...El código de solicitud no es incorrecto. Cuando se usan fragmentos de la biblioteca de soporte de v4, el índice de fragmento 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 tarde para encontrar el fragmento correcto para entregar el resultado.
Por lo tanto, para las actividades iniciadas en el objeto de fragmento de formulario, maneje onActivityResult requestCode como se muestra a continuación:
fuente
Más fácil:
Java :
int unmaskedRequestCode = requestCode & 0x0000ffff
Kotlin :
val unmaskedRequestCode = requestCode and 0x0000ffff
Verifique los 16 bits inferiores, simplemente desenmascare haciendo un AND lógico con los 16 bits superiores puestos a cero
fuente
Si está proporcionando constante, hágalo público y luego úselo en
startActivityResult
ejemplo:
fuente
También puede definir
super.onActivityResult(requestCode, resultCode, data)
en
Activity
(si anulaonActivityResult
) en estey llama
startActivityForResult(intent, requestCode)
dentro de tuFragment
fuente
en fragmento
en Actividad Principal:
fuente