2010-12-22 29 views
16

Esto me ha estado matando durante dos días. Tengo una actividad principal A que llama una segunda actividad B. La actividad B simplemente presenta al usuario una vista de lista. Cuando presiono un elemento en la vista de lista, quiero que un par de cadenas pasen a la Actividad principal A y Activiy B finalizará.Android onActivityResult siempre es 0

El problema es que siempre obtengo un código de resultado de 0 y el paquete de datos es nulo. Realmente no entiendo por qué está sucediendo esto.

Aquí está mi código.

Comience la actividad B para el resultado;

Test.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent i = new Intent(recipeActivity.this, BrowseLoadRecipes.class); 
      startActivityForResult(i, RECIPE_CHOOSER); 
    } 
    }); 

Esto inicia la segunda Actividad bien. La actividad B completa una vista de lista y cuando hago clic en un elemento intento devolver datos a la actividad de llamada A.

Cualquier texto en este momento, así que utilicé lo siguiente en la Actividad B;

 lv.setOnItemClickListener(new OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
     Bundle bundle = new Bundle(); 
     bundle.putString("TEXT", "Please work... pleeeeaasee"); 
     Intent mIntent = new Intent(); 
     mIntent.putExtras(bundle); 
     setResult(RESULT_OK, mIntent); 
     finish(); 
    } 
    }); 

En la actividad de llamada, tengo la siguiente respuesta para la devolución de la siguiente manera;

protected void onActivityResult(int requestCode, int resultCode, 
     Intent data) { 
      switch(requestCode) { 
      //TODO 
      case RECIPE_CHOOSER: 
       Toast.makeText(getApplicationContext(), "In recipe return", Toast.LENGTH_SHORT).show(); 
       Toast.makeText(getApplicationContext(), "resultCode is " + String.valueOf(resultCode), Toast.LENGTH_SHORT).show(); 
       if (resultCode == RESULT_OK) { 
       Bundle b = getIntent().getExtras(); 

       Toast.makeText(getApplicationContext(), "Returned " + b.getString("TEXT"), Toast.LENGTH_LONG).show(); 
       } 
       if (resultCode == RESULT_CANCELED) { 

        } 
       break; 

       } 
      } 
     } 

puedo ver que el código de petición se devuelve correctamente, pero el resultcode es siempre un 0 y los datos siempre es un valor nulo.

He revisado la depuración y el setResult está haciendo su trabajo y el paquete sí tiene los datos que estoy pasando, pero se perdió en algún momento en el camino.

¿Hay algo en el manifiesto que me falta o algo así? Ha matado mi progreso en este proyecto hasta ahora.

Cualquier ayuda sería realmente apreciada.

Gracias, Dean

Respuesta

15

En su actividad de la lista, onItemClickListener intentar algo de sustitución de las líneas SetResult con:

if (getParent() == null) { 
    setResult(Activity.RESULT_OK, data); 
} 
else { 
    getParent().setResult(Activity.RESULT_OK, data); 
} 

Me pregunto si hay una actividad del padre que es lo que necesita vincular los datos y establecer el resultado en ....

+0

Creo que esto va a funcionar. Lo intentaré ahora y te responderé en cinco minutos. Gracias por la respuesta. – Dean

+3

Dave ... si estuviera allí contigo ahora, te compraría una pinta fría y adorable. Funcionó perfectamente. Gracias de nuevo ... – Dean

+1

Después de pensar en esto, ahora sé la razón por la cual mi código original no funcionaba. La intención de iniciar primero (Actividad B) es realmente solo una intención del titular de la pestaña frontal que luego inicia dos intenciones más en dos pestañas diferentes (la primera pestaña para ver los archivos locales, la segunda para ver los archivos ubicados en la web). El principal intento de regreso debería haber sido el primer intento, por lo tanto, la excelente respuesta de Daves me señala de nuevo al padre. Yo viví y aprendí hoy. – Dean

5

En relación con los datos devueltos.

lo hace:

Bundle b = getIntent().getExtras(); 

pero "getIntent()" devuelve la intención de que comenzó esta actividad. Si desea que los datos devueltos por la actividad que comenzó a consecuencia de ello, acaba de tomar los datos que se pasa a

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
-3

Su código está perfectamente trabajando ........

in u Activity B 
use 
    setResult(0, mIntent);insted of setResult(RESULT_OK, mIntent); 
in your Activity A: 
use 
case 0: insted case RECIPE_CHOOSER: and 
use System.out.println(b.getString("TEXT")); 

Obtendrá la salida como

Por favor, trabaje ...pleeeeaasee

+6

Eso está enmascarando el problema , De Verdad. 0 es el valor para la enumeración RESULT_CANCELED, no el RESULT_OK. Y cualquier devolución de la Actividad B (cuando se llama a finish()) que no tiene un conjunto de códigos de resultado se establece automáticamente en RESULT_CANCELED – jaseelder

Cuestiones relacionadas