2017-06-12 6 views
1

Ich habe überall gesucht und ich kann keine funktionierende Lösung finden, wie man ZXing in einem Fragment implementiert. Mehrere Quellen haben mir gesagt, dass dies richtig ist, aber onActivityResult wird nie aufgerufen.Verwendung von ZXing in einem Fragment

auf den Button löst den Scanner zu öffnen, sollte

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    view = inflater.inflate(R.layout.fragment_barcode,container,false); 
    final Button openBC = (Button)view.findViewById(R.id.btnOpen); 
    openBC.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v){ 
      //This opens up the Barcode Scanner 
      IntentIntegrator integrator = new IntentIntegrator(getActivity()); 
      integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES); 
      integrator.setPrompt("Scan A barcode or QR Code"); 
      integrator.setCameraId(0); 
      integrator.setBeepEnabled(false); 
      integrator.setBarcodeImageEnabled(false); 
      integrator.initiateScan(); 
     } 
    }); 


    return view; 
} 

Hier wird das Ergebnis der Abfrage verarbeitet werden, aber es wird nie hier

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); 
    if(result != null) { 
     if(result.getContents() == null) { 
      Log.d("MainActivity", "Cancelled scan"); 
      Toast.makeText(getActivity(), "canceled",Toast.LENGTH_LONG).show(); 
     } else { 
      Log.d("MainActivity", "Scanned"); 
      Toast.makeText(getActivity(),"Scanned: " + result.getContents(),Toast.LENGTH_LONG).show(); 
     } 
    }else { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 
+1

Versuchen Sie das Fragment an den IntentIntegrator-Konstruktor übergeben. Wo überschreiben Sie auch das onActivityResult? In dem Fragment oder der Aktivität? – jgriffin

+0

Die Methode 'onActivityResult' der Aktivität, die Ihr Fragment enthält, wird aufgerufen. –

+0

@jgriffin Ja, ich überschreibe das onActivityResult, und ich habe versucht, das Fragment in. –

Antwort

2

Sie Dies geschieht, weil aus außer Kraft setzen onActivityResult Fragment aber initializeIntegrator IntentIntegrator integrator = new IntentIntegrator(getActivity()); mit Aktivität.

Sie haben zwei Möglichkeiten: 1) Überschreiben Sie onActivityResult innerhalb der Aktivität . 2) Ändern Sie das Initialisierungsübergabefragment in der Aktivitätsinstanz.

Dies sollte Sie werden helfen:

dass Fragment Unter der Annahme, MyFragment genannt wird:

IntentIntegrator.forFragment(MyFragment.this).initiateScan(); 

ZXing Minimal

+0

Es teilt mir: ForFragment (android.app.Fragment) in IntentIntegrator kann nicht angewendet werden (anonymous android.view.View.OnClickListener) –

+0

dies weil Sie "this" innerhalb von onclicklistener verwenden, indem Sie die Schnittstelle anstelle der Fragment-Instanz übergeben. Benutze "NameOfYourFragment" .dieser –

+0

@DanJackson sehe meine bearbeitete Antwort –

1

Wenn das Fragment aus Import importiert android.support.v4.app.Fragment dann sollten Sie verwenden IntentIntegrator.forSupportFragment(this).initiateScan();

Wenn das Paket vonimportiert wirdimportieren android.app.Fragment dann IntentIntegrator.forFragment(MyFragment.this).initiateScan(); kann verwendet werden ..