stackoverflow activity android

android - stackoverflow - MĂșltiples onActivityResult para 1 actividad



startactivityforresult fragment (3)

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 de edición de texto y 3 botones (uno para cada activo para el que estoy recopilando datos). Los botones invocan startActivityForResult para el escáner de código de barras, luego deseo pasar el resultado a la vista de edición de texto asociada en función de qué botón se presionó (ejemplo: presione el botón "escanear" a la derecha del texto de edición "Activo - PC", escanear y devolver datos a su texto de edición asociado. Luego, si presiona el botón "escanear" que está al lado del texto de edición "Asset - Mon1", devuelva los datos al texto de edición de "Asset - Mon1" ... y así sucesivamente ...)

Con el código que tengo aquí, todos los artículos funcionan, pero no según lo previsto. Al presionar cualquiera de los botones "escanear" siempre se devuelve el resultado a la primera vista de edición de texto "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 solución, gracias por toda tu 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 en ambas llamadas ... use números diferentes como 0 y 1 ... luego puede implementar un interruptor en su método onActivityResult con el código de solicitud. Si requestCode = 0, entonces el primer método ha regresado, si es 1, entonces el segundo ha regresado. Esto debería 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 deberían ser algo así: (por primera vez)

startActivityForResult(intent1, 0);

(Por segunda vez)

startActivityForResult(intent2, 1);

(por tercera vez)

startActivityForResult(intent3, 2);

(por 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.


Mientras inicia ActivityForResult, envía un código de solicitud con este, debe ser diferente (único) para cada una de las actividades que comienza desde su botón, digamos que el botón 1 inicia el código de solicitud de actividad 1, el código de solicitud 2 del botón 2 y el código de solicitud 3 del botón 3 Entonces, para su actividad principal, solo debe tener un onActivityResult () en esta función, tome un caso de cambio, escanee los códigos de solicitud, requestcode = 1 dará el resultado de la primera actividad y el código de solicitud = 2 dará para la actividad 2 y así sucesivamente ...


No hay nada en Android que reconozca y llame a los métodos llamados onActivityResult2 o onActivityResult3. Esos son solo nombres de métodos que inventaste y que serán ignorados por el sistema.

Debe cambiar su código de modo que pase un código de solicitud diferente cuando llame a startActivityForResult (). (requestCode es el segundo parámetro de ese método)

Luego, en onActivityResult, verifique el código de solicitud para ver de qué actividad está obteniendo el resultado, y maneje en consecuencia.