Multiple onActivityResult para 1 Actividad

Así que tengo una aplicación muy simple en la que estoy trabajando. Su propósito es recopilar datos de activos de 1 PC, y 1 o 2 monitores. Mi formulario contiene 3 vistas edittext y 3 botones (uno para cada activo para el que recojo datos). Los botones invocan startActivityForResult para el escáner de código de barras, entonces quiero pasar el resultado a la vista de edittext asociada en función de qué botón fue presionado (ejemplo: pulse el botón "scan" a la derecha de "Asset – PC" A su asociado edittext.A continuación, si pulsa el botón "escanear" que está al lado de la "Asset – Mon1" edittext, devolver datos a "Asset – Mon1" edittext …. y así sucesivamente …)

Con el código que tengo aquí, todos los artículos de trabajo, no sólo como se pretende. Al presionar cualquiera de los botones "escanear" siempre se devuelve el resultado a la primera vista de edición "Activo – PC".

public class TestShit extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void assetPcClick(View view) { Intent intent1 = new Intent("com.google.zxing.client.android.SCAN"); intent1.setPackage("com.google.zxing.client.android"); intent1.putExtra("SCAN_MODE", "ONE_D_MODE"); startActivityForResult(intent1, 0); } public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents1 = intent.getStringExtra("SCAN_RESULT"); String format1 = intent.getStringExtra("SCAN_RESULT_FORMAT"); EditText assetPC = (EditText) findViewById(R.id.assetPC); assetPC.setText(contents1); } else if (resultCode == RESULT_CANCELED) { // Handle cancel } } } public void assetMon1Click(View view) { Intent intent2 = new Intent("com.google.zxing.client.android.SCAN"); intent2.setPackage("com.google.zxing.client.android"); intent2.putExtra("SCAN_MODE", "ONE_D_MODE"); startActivityForResult(intent2, 0); } public void onActivityResult2(int requestCode, int resultCode, Intent intent2) { if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents2 = intent2.getStringExtra("SCAN_RESULT"); String format2 = intent2.getStringExtra("SCAN_RESULT_FORMAT"); EditText assetMon1 = (EditText) findViewById(R.id.assetMon1); assetMon1.setText(contents2); } else if (resultCode == RESULT_CANCELED) { // Handle cancel } } } public void assetMon2Click(View view) { Intent intent3 = new Intent("com.google.zxing.client.android.SCAN"); intent3.setPackage("com.google.zxing.client.android"); intent3.putExtra("SCAN_MODE", "ONE_D_MODE"); startActivityForResult(intent3, 0); } public void onActivityResult3(int requestCode, int resultCode, Intent intent3) { if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents3 = intent3.getStringExtra("SCAN_RESULT"); String format3 = intent3.getStringExtra("SCAN_RESULT_FORMAT"); EditText assetMon2 = (EditText) findViewById(R.id.assetMon2); assetMon2.setText(contents3); } else if (resultCode == RESULT_CANCELED) { // Handle cancel } } } 

}

¿Alguna sugerencia sobre cómo puedo administrar mejor mis múltiples "ActivityForResult" y "onActivityResult"?


Mi arreglo, gracias por toda su ayuda!

 public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents1 = intent.getStringExtra("SCAN_RESULT"); String format1 = intent.getStringExtra("SCAN_RESULT_FORMAT"); EditText assetPC = (EditText) findViewById(R.id.assetPC); assetPC.setText(contents1); } else if (resultCode == RESULT_CANCELED) { // Handle cancel } } if (requestCode == 1) { if (resultCode == RESULT_OK) { String contents1 = intent.getStringExtra("SCAN_RESULT"); String format1 = intent.getStringExtra("SCAN_RESULT_FORMAT"); EditText assetMon1 = (EditText) findViewById(R.id.assetMon1); assetMon1.setText(contents1); } else if (resultCode == RESULT_CANCELED) { // Handle cancel } } if (requestCode == 2) { if (resultCode == RESULT_OK) { String contents1 = intent.getStringExtra("SCAN_RESULT"); String format1 = intent.getStringExtra("SCAN_RESULT_FORMAT"); EditText assetMon2 = (EditText) findViewById(R.id.assetMon2); assetMon2.setText(contents1); } else if (resultCode == RESULT_CANCELED) { // Handle cancel } } } 

En su startActivityForResult , no use 0's en ambas llamadas … use números diferentes como 0 & 1 … entonces puede implementar un switch en su método onActivityResult con el requestCode. Si el requestCode = 0 entonces el primer método ha vuelto, si es 1, entonces el segundo ha vuelto. Esto debe ser el mismo para más llamadas.

 public void onActivityResult(int requestCode, int resultCode, Intent intent){ switch(requestCode){ case 0: // Do your stuff here... break; case 1: // Do your other stuff here... break; case etc: break; } } 

Las llamadas deben ser algo así: (Por primera vez)

 startActivityForResult(intent1, 0); 

(Por segunda vez)

 startActivityForResult(intent2, 1); 

(por tercera vez)

 startActivityForResult(intent3, 2); 

(Por la enésima vez)

 startActivityForResult(intentn, n - 1); 

O bien, podría declarar valores int estáticos para usar, en lugar de los valores int más irreconocibles.

No hay nada en Android que vaya a reconocer y llamar a métodos llamados onActivityResult2 o onActivityResult3. Esos son sólo nombres de métodos que inventó que van a ser ignorados por el sistema.

Debe cambiar su código para que pase un código de solicitud diferente al llamar a startActivityForResult (). (RequestCode es el segundo parámetro de ese método)

A continuación, en onActivityResult, compruebe el requestCode para ver de qué actividad está obteniendo el resultado y manejarlo en consecuencia.

Mientras iniciaActivityForResult envía un código de petición con él, éste debe ser diferente (único) para cada actividad que esté empezando desde su botón, diga que el botón 1 inicia el código de solicitud de actividad 1, el botón 2 requestcode = 2 y el botón 3 request code = 3 , Entonces para su actividad de padre debe tener sólo un onActivityResult () en esta función tomar un caso de conmutación, escanear requestcodes, requestcode = 1 dará resultado de la primera actividad y el código de solicitud = 2 da para la actividad 2 y así sucesivamente …

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