Android obteniendo RESULT_CANCELED cuando añado específicamente RESULT_OK

Este es mi problema, tengo la vista principal que sólo muestra un botón, presionando este botón se muestra otra vista. Esta vista sólo tiene otro botón, cuando se pulsa este botón, esta vista actual finaliza y el control vuelve a la vista anterior.

Para mostrar la segunda vista que uso startActivityForResult, pongo 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 finalmente, el método onActivityResult 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 problema es resultCode siempre es 0 = RESULT_CANCELED y no sé cómo solucionarlo, ¿puede alguien ayudarme?

¡Muchas gracias!

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

Un FooActivity con sólo 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 como eso:

 <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 el onClicEvent del btnBar (Button):

 @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 (), al presionar el botón de Android "BACK", puede obtener errores.

Si la Intención (intención) en la Actividad B es dar alguna información a la actividad A, si presionas el botón de nuevo, no sé si la actividad B estará en la pila, pero la intención no se hace. 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(); } 

Al manejar la información, hice lo siguiente en el evento onActivityResult () para ver la información recuperada en la barra 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 devolver la información a la actividad de los padres, las buenas prácticas hacen 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 usted no puede hacer este código de la muestra. Por favor déme su email para mí envíe el proyecto de FooBarActivity

aquí,

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

Funciona para devolver (RESULT_OK) presionando el botón ATRÁS. No llames

super.onBackPressed() .

Utilizar esta

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

en lugar de

 setResult(RESULT_OK); 

solamente

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.