2011-02-17 15 views
13

Así que tengo una aplicación muy simple en la que estoy trabajando. Su propósito es recopilar datos de activos desde 1 pc y 1 o 2 monitores. Mi formulario contiene 3 vistas de texto de edición 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 quiero pasar el resultado a la vista de texto editable asociada según el botón que se haya presionado (ejemplo: presione el botón "escanear" a la derecha del texto de edición "Asset - PC", escanee y devuelva datos a su texto de edición asociado. Luego, si presiona el botón "escanear" que está junto al texto de edición "Activo - Mon1", devuelva los datos al texto de edición "Activo - Mon1" ... etc ...)Multiple onActivityResult for 1 Activity

Con el código que tengo aquí, todos los elementos funcionan, pero no como se esperaba. Al presionar cualquiera de los botones "escanear" siempre se devuelve el resultado a la primera vista de texto editable "Asset - 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 
      } 
     } 
    } 

}

Cualquier sugerencia sobre cómo puedo manejar mejor mi múltiple "ActivityForResult" y "onActivityResult" 's?


Mi solución, 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 
      } 
     } 
    }  
+2

¿Sería tan amable de seleccionar una respuesta correcta? El crédito va donde se debe el crédito ...;) – ThaMe90

Respuesta

29

En su startActivityForResult, no use 0 en ambas llamadas ... use números diferentes como 0 & 1 ... luego puede implementar un interruptor en su método onActivityResult con el requestCode. Si el requestCode = 0, entonces el primer método ha regresado, si es 1, entonces el segundo ha regresado. Esto debería ser igual 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 como esto, entonces: (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, usted podría declarar valores int estática para el uso, en lugar de los valores int más irreconocibles.

+0

Gracias. ¡Ahora que los veo mucho más limpios! LOL. Daré una oportunidad, pero debo correr a trabajar ahora. Lo haré esta tarde y responderé de nuevo para que todos sepan cómo lo hice. – Devin

2

Mientras startActivityForResult se envía un requestcode con ella, esto debe ser diferente (única) para cada actividad que está empezando desde el botón, dicen código del botón 1 comienza solicitud de la actividad 1, el botón 2 requestcode = 2 y el botón 3 código de solicitud = 3, luego para su actividad padre debe tener solo uno en Análisis de actividad() en esta función tomar una caja de cambio, buscar códigos de solicitud, solicitar código = 1 dará el resultado de la primera actividad y solicitar código = 2 da para actividad 2 y así sucesivamente ...

+0

Gracias. Ahora estoy investigando la opción "cambiar". Pero lo hice funcionar correctamente al invocar 3 declaraciones "if" en el 1 onActivityResult. Publicará el código. Cualquier sugerencia que ayudará a limpiarlo sería maravilloso también. Eventualmente, habrá muchos de estos en mi aplicación y como soy nuevo en la programación de Android, estoy seguro de que mis aplicaciones se hincharán hasta que aprenda a estructurarme y condensarme lo suficientemente bien. – Devin

3

No hay nada en Android que vaya a reconocer y llamar a los métodos denominados onActivityResult2 o onActivityR esult3. Esos son solo nombres de métodos que usted inventó que el sistema ignorará.

Necesita cambiar su código para 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 compruebe el requestCode para ver de qué actividad obtiene el resultado y proceda según corresponda.

+0

Gracias. Me preguntaba sobre eso, aunque el IDE no me calentó así que supuse que lo manejaría. Sí, este es mi primer intento real en una aplicación de Android :) Gracias por su ayuda y paciencia. – Devin