startActivityForResult y las intenciones Extras, parece extras no son empujados hacia atrás
-
30-09-2019 - |
Pregunta
Tengo este código:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setData(ContactsContract.Contacts.CONTENT_URI);
intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());
startActivityForResult(intent, PICK_CONTACT);
A continuación, en la respuesta:
public void onActivityResult(int reqCode, int resultCode, Intent data) {
switch (reqCode) {
case (PICK_CONTACT):
if (resultCode == Activity.RESULT_OK) {
try {
Uri contactData = data.getData();
String onlineid = data.getStringExtra(EXTRA_ONLINE_ID);
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
super.onActivityResult(reqCode, resultCode, data);
}
la variable onlineid
es nulo. ¿Cómo puedo pasar un valor y luego recibir de vuelta?
Editar
Incluso he intentado,
Bundle extras = data.getExtras(); // returns null
Solución
Esto se hace por diseño; las actividades del sistema no van a enviar de vuelta los extras con los que se les llama, por lo que tiene que gestionar los datos en otro lugar.
Por suerte, el parámetro resultCode
está totalmente controlado por sí mismo, lo que significa que se pueden utilizar para indexar sus datos.
private final int PICK_CONTACT = 0;
private Bundle[] myDataTransfer = { null };
...
Bundle myData = new Bundle();
myData.putString(EXTRA_ONLINE_ID, (String) v.getTag());
myDataTransfer[PICK_CONTACT] = myData;
// create intent and all
startActivityForResult(intent, PICK_CONTACT);
...
public void onActivityResult(int reqCode, int resultCode, Intent data) {
if (resultCode == PICK_CONTACT) {
Bundle myData = myDataTransfer[resultCode];
String onlineid = myData.getString(EXTRA_ONLINE_ID);
}
}
No soy un programador de Java, tiene que haber una manera más agradable de aplicar un mapa de paquetes, pero esto funciona:)
Otros consejos
BIEN Verificar si su actividad Android: launchMode se configura como SingleTask o SingleInstance! ese debe ser el problema:)
Yo estaba corriendo en algunos problemas con esto también.
En lugar de esta línea
intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag());
Trate
intent.putExtra(EXTRA_ONLINE_ID, "" + v.getTag());
El campo EXTRA_ONLINE_ID tendrá que ser fijado en la actividad que se puso en marcha utilizando setResult. Si no es el establecimiento de ese valor en la intención de regresar (que es diferente de lo que usted envió) por lo que recibirá un valor nulo.