2010-05-18 6 views
15

tengo este código:startActivityForResult y las intenciones Extras, parece extras no son empujados hacia atrás

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); 

Luego de 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 volver a recibirlo?

EDITAR

Incluso he intentado,

Bundle extras = data.getExtras(); // returns null 
+0

cheque resultCode debe ser -1 para Activity.RESULT_OK – Jorgesys

+0

que está bien , entra en eso si, pero los Extras están vacíos. – Pentium10

Respuesta

3

Esto se hace por diseño; las actividades del sistema no enviarán de vuelta los extras con los que se llaman, por lo que debe administrar los datos en otro lugar.

Afortunadamente, el parámetro resultCode está totalmente controlado por usted mismo, lo que significa que puede usarlo 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 :)

+1

Cuando comienzas una actividad, tu actividad puede ser asesinada. Entonces el índice se habrá ido. Creo que deberás conservar el paquete en algún lugar fuera de la memoria de tu aplicación. – rumpel

+0

Para agregar al comentario por @rumpel, puede probar esto yendo a Configuración> Opciones de desarrollador y habilitando "No mantener actividades". De esta forma, podrá probar este uso y descubrir que los datos en myDataTransfer se eliminarán a menos que guarde/restaure manualmente en onSaveInstanceState – strangetimes

0

bien Compruebe si su androide Actividad: launchMode se configura como SingleTask o SingleInstance! ese debe ser el problema :)

+0

Esto no ayuda. – Pentium10

+0

Hola Pentium10, ¿resolviste esto? Creo que todo está bien en tu código: S – Jorgesys

+1

No lo resolví. Creo que los extras personalizados que pasamos a esa otra actividad no se conservan. – Pentium10

0

Me encontré con 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()); 
0

El campo EXTRA_ONLINE_ID tendrá que ser fijado en la actividad que se puso en marcha utilizando setResult. Si no está configurando ese valor en el Intento devuelto (que es diferente de lo que envió), entonces obtendrá un valor nulo.

+0

Como ve, utiliza ContactsContract.Contacts.CONTENT_URI que no es parte de mi base de código. – Pentium10

+0

No puedo evitarlo, supongo. Las preguntas son, ¿por qué quieres devolver los datos que ya tienes? – Abhinav

+0

Quiero que sea compatible con otro fragmento de código. – Pentium10

Cuestiones relacionadas