2017-06-12 61 views
1

我搜遍了各地,我找不到一個關於如何在片段中實現ZXing的工作解決方案。多個消息來源告訴我這是正確的,但onActivityResult永遠不會被調用。在片段中使用ZXing

點擊該按鈕觸發掃描儀打開

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; 
} 

這就是掃描的結果應進行處理,但它從來沒有送過來

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

嘗試將片段傳遞給IntentIntegrator構造函數。另外你在哪裏重寫onActivityResult?在片段還是活動? – jgriffin

+0

包含您的片段的活動的'onActivityResult'方法將被調用。 –

+0

@jgriffin是的,我重寫了onActivityResult,並試圖傳入片段。 –

回答

2

這會發生,因爲你從覆蓋onActivityResult片段,但初始化intentIntegrator IntentIntegrator integrator = new IntentIntegrator(getActivity());與活動。

你有兩種選擇: 1)覆蓋onActivityResult內部活動 2)更改在活動實例內部傳遞片段的初始化。

這應該是幫助您:

假設片段稱爲MyFragment:

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

ZXing Minimal

+0

它告訴我:intentIntegrator中的forFragment(android.app.Fragment)不能應用於(匿名android.view.View.OnClickListener) –

+0

this因爲你在傳遞接口而不是片段實例的onclicklistener中使用「this」。使用「NameOfYourFragment」。這 –

+0

@丹傑克遜看到我編輯的答案 –

1

如果該片段從 進口android.support.v4.app.Fragment進口,那麼你應該使用IntentIntegrator.forSupportFragment(this).initiateScan();

如果從導入分段import android.app.Fragment then IntentIntegrator.forFragment(MyFragment.this).initiateScan(); can be used ..