startActivityForResult y las intenciones Extras, parece extras no son empujados hacia atrás

StackOverflow https://stackoverflow.com/questions/2859831

  •  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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top