2011-02-04 14 views
13

Este es mi problema, tengo la vista principal que solo muestra un botón, al presionar este botón se muestra otra vista. Esta vista solo tiene otro botón, cuando este botón empuja esta vista finaliza y el control retrocede a la vista anterior.Android obteniendo RESULT_CANCELED cuando agrego específicamente RESULT_OK

Para mostrar la segunda vista que uso startActivityForResult, coloco el código aquí.

private void startNewview() {  
    Intent it = new Intent(getApplicationContext(), newView.class); 
    startActivityForResult(it,VIEW_ID); 

} 

La vista llamada sólo tiene un evento de botón, aquí está el código

Button b = (Button) findViewById(R.id.close); 
    b.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
      setResult(RESULT_OK);    
      finish(); 

     } 
    }); 

Y, por último, la onActivityResult método en la vista principal, aquí está el código

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == VIEW_ID && resultCode == RESULT_OK) { 
     tv = (TextView) findViewById(R.id.tv); 
     tv.setText("The result ok is here :)"); 
    } 

} 

El el problema es resultCode siempre es 0 = RESULT_CANCELED y no sé cómo resolverlo, ¿alguien puede ayudarme?

¡Muchas gracias!

+0

Duplicado de http://stackoverflow.com/questions/2679250/setresult-does-not-work-when-back-button-pressed – pjv

Respuesta

5

No puedo explicar lo que está sucediendo en su código, pero tengo una muestra de proyectos para hacer esto ..

a FooActivity con solo un botón btnFoo:

@Override 
protected void onStart() { 
    super.onStart(); 

    btnFoo.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      startActivityForResult(new Intent("xper.activity.ACTIVITY_BAR_INTENT"),1); 
     } 
    }); 
} 

y un BarActivity añadido en el AndroidManifest.xml así:

<activity 
    android:name = "BarActivity"> 
    <intent-filter> 
     <action 
      android:name = "xper.activity.ACTIVITY_BAR_INTENT"/> 
     <category 
      android:name = "android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 

El código respectivo para recuperar la intención dentro de la barra está en la onClicEvent de la btnBar (botón):

@Override 
protected void onStart() { 
    super.onStart(); 

    btnBar.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent("xper.activity.ACTIVITY_BAR_RESULT_INTENT"); 
      intent.putExtra("codBar", "bar"); 
      setResult(Activity.RESULT_OK, intent); 
      finish(); 

     } 
    }); 
} 

Ahora, si no maneja bien el evento onActivityResult(), cuando presiona el botón "ATRÁS" de Android, puede obtener errores.

Si la intención (intención) en la actividad B es dar información a la actividad A, si presiona el botón hacia atrás, no sé si la actividad B estará en la pila, pero la intención no es hecho. Así que hice lo siguiente:

@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 
    super.onBackPressed(); 

    //Intent intent = new Intent("xper.activity.ACTIVITY_BAR_RESULT_INTENT"); 
    //intent.putExtra("codBar", "bar"); 
    //setResult(Activity.RESULT_CANCELED, intent); 
    setResult(Activity.RESULT_CANCELED); 
    finish(); 
} 

Manejo de la información que hice lo siguiente en el evento onActivityResult() para ver la información recuperada en la Barra de Actividad:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(data != null) { 
     Toast.makeText(this, "BAR\trequestCode == " + requestCode + "\tresultCode == " + resultCode + "\tdata == " + data, 10000).show(); 
     btnFoo.setText("BAR\trequestCode == " + requestCode + "\tresultCode == " + resultCode + "\tdata == " + data /*+ "extras == " + data.getExtras().getString("codBar")*/); 
    } else { 
     Toast.makeText(this, "BAR\trequestCode == " + requestCode + "\tresultCode == " + resultCode, 10000).show(); 
     btnFoo.setText("BAR\trequestCode == " + requestCode + "\tresultCode == " + resultCode); 
    } 

} 

si tiene más actividades para volver infomación a la actividad de los padres es buena pratices haga lo siguiente:

//put private static final int globals atributes with the respective name of the 
//activity to represent the requestCode for each activity you have like: 
private static final int ACTIVITY1 = 117; 
private static final int ACTIVITY2 = 118; 
... 
private static final int ACTIVITYN = 215; 

//In the event onActivityResult() is better use the switch statement to handle each 
//specific activity to catch information 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if(resultCode == Activity.RESULT_CANCELED) return; // breaks 
    //if you decide to handle some information of Activity.RESULT_CANCELED 
    //ignore the above condition that returns and handle it inside the switch statement 

    switch(requestCode) { 
    case ACTIVITY1: 
    { 
     //Dosomething 
    } break; 
    case ACTIVITY2: 
    { 
     //Dosomething 
    } break; 
    ... 
    case ACTIVITYN: 
    { 
     //Dosomething 
    } break; 
    } 
} 

Si no se puede hacer este código de ejemplo .. por favor, dame tu e-mail para mí envía el proyecto FooBarActivity

+0

en realidad tu "onBackPressed()" no funcionó aquí a menos que elimine el (innecesario) super.OnBackPressed(). – chksr

+0

'' 'nuevo intento (" xper.activity.ACTIVITY_BAR_INTENT "), 1)' '' no coincide con ningún constructor –

-1

Utilice esta

Intent returnIntent = new Intent(); 
    setResult(RESULT_OK,returnIntent); 

en lugar de

setResult(RESULT_OK); 

única

+0

He intentado con esa solución pero no funciona, obtengo lo mismo: S –

+0

¿Estás utilizando finish() después de setResult –

6

aquí,

@Override 
public void onBackPressed() { 
    setResult(Activity.RESULT_OK); 
    finish(); 
} 

hace el trabajo para volver (RESULT_OK) pulsando el botón ATRÁS. NO llame al

super.onBackPressed().

+0

Esta es la respuesta correcta. –

Cuestiones relacionadas