studio - onactivityresult camera android
El código de solicitud incorrecto devolvió onActivityResult de otra actividad (2)
Tengo una Activity
que llama a otra Activity
, que llama a otras Activities
. Envío a la última Activity
para obtener un resultado y luego devuelvo el resultado a la primera Activity
.
El flujo es algo así como
A -> B -> C -> D -> C -> B -> A
Con el flujo de A
a D
se hace de startActivityForResult
y el flujo de D
a A
se hace de onActivityResult
.
De D
a B
el requestCode
es siempre el mismo (el que decidí), pero de B
a A
cambia repentinamente de mi valor a un valor aleatorio (en este caso particular, 196614).
Este es el código que utilizo para llamar a la activity B
de la activity A
:
filterByCatalogue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), CatalogueContainerActivity.class);
startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);
}
});
(Con filterByCatalogue
como FrameLayout
)
Este es el código que uso para devolver la activity A
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == Defines.FILTER_BY_CATALOGUE) {
if (resultCode == RESULT_OK) {
Intent intent = new Intent();
intent.putExtra("article", data.getStringExtra("article"));
setResult(RESULT_OK, intent);
finish();
}
}
}
He buscado mucho pero no encuentro dónde me equivoco ...
El código de solicitud no es aleatorio. 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. Reference .
Por ejemplo, 196614 es realmente 3 << 16 + 6, donde 3 es el índice de fragmentos más uno y 6 es el código de su solicitud.
Moral: no mezclar actividad / fragmento startActivityForResult()
y onActivityResult()
. Cuando se inicia desde una actividad, procesar el resultado en la actividad. Cuando se inicia desde un fragmento, procesa el resultado en el fragmento.
Simplemente reemplazar
startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);
con
getActivity().startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);
Funcionará seguro. :)