2010-08-19 16 views
4

J'ai une application qui a besoin de scanner un code à barres pour obtenir un code avant de pouvoir continuer.Android onActivityResult déclenché avant même que l'activité commence!

J'utiliser ce code pour commencer l'activité de balayage:

finish = (Button) findViewById(R.id.finishButton); 
     finish.setOnClickListener(new OnClickListener() { 
      public void onClick(View viewParam) { 

       /*Prompt the user to scan the barcode */ 
       new AlertDialog.Builder(Visit.this) 
       .setMessage("Please Scan the clients barcode to complete the visit") 
       .setPositiveButton("Scan Barcode", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         //Start the scan application 
         Intent intent = new Intent("com.google.zxing.client.android.SCAN"); 
         startActivityForResult(intent, 0); 
        } 
       }) 

       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         //Execute some method call 
         Toast.makeText(Visit.this, "Scan declined...", Toast.LENGTH_SHORT).show(); 
        } 
       }) 
       .show(); 
       /* End of Scan prompt */ 
      } 
     }); 

Ce que le code ci-dessus ne se définit un écouteur sur un bouton « terminé » Lorsque le bouton est cliqué, il affiche un message demandant au l'utilisateur pour scanner un code à barres ou annuler.

Cliquer sur le bouton 'Scan Barcode' lance une nouvelle activité qui lance le scan.

J'ai le code suivant mis en place pour lire le résultat de l'analyse sur le retour de l'analyse:

/* Return from scanning barcode */ 
    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
; 
     if (resultCode == Activity.RESULT_OK && requestCode == 0) { 
     Bundle extras = data.getExtras(); 
     String result = extras.getString("SCAN_RESULT"); 
     } 
     Toast.makeText(Visit.this, "request code: "+requestCode+" result code = "+resultCode+ "\nRESULT_OK: "+Activity.RESULT_OK, Toast.LENGTH_SHORT).show(); 
    } 

qui sort très simplement (pour l'instant) le résultat Avtivity dans un message de pain grillé. Le problème que j'ai, c'est que la méthode onActivityResult est déclenchée dès que j'appuie sur le bouton du code-barres de balayage.

Le processus de numérisation fonctionne très bien que je peux voir les résultats de l'analyse dans le logcat. Mais parce qu'elle est déclenchée trop tôt la méthode onActivityResult obtient jamais le résultat de l'analyse et le code de résultat est toujours -1

Est-ce que je manque une étape ici? Y a-t-il moyen d'arriver à onActivityResult pour attendre que l'activité se termine?

Merci

Kevin

Répondre

9

Qu'à cela ne tienne, il semble que le scanner de code-barres J'utilise a un bug particulier pour les interfaces onglet avec instance unique dans le manifeste qui est de savoir comment je l'avais. La suppression de la stipulation d'instance unique m'a permis de faire un hack qui fonctionne parfaitement.

Oh, bien vous vivez et apprenez.

Merci

Kevin

+0

Vous m'a sauvé au moins une heure de débogage avec cela! Je l'ai utilisé dans le fragment imbriqué de ViewFlipper et j'ai eu le même problème. La suppression d'une seule instance a résolu ce problème. – pkk

+0

@pkk Heureux d'avoir été utile à quelqu'un! –

+0

thx! android: launchMode = "singleTask" provoque aussi ce genre de problème – thecr0w