2016-04-19 4 views
0

私はXamarinとZxingライブラリでアンドロイド用のコードバーアプリケーションを開発しています。 私の目的は、コードバービューで画面の半分を同じビューに表示し、スキャンされたオブジェクトをリストに追加または削除するボタンで残りの半分を表示することでした。 MainActivityのOnCreate関数で Xamarin Zxing Fragment OnPauseビュー階層を作成した元のスレッドのみがそのビューに触れることができます

私が持っている:

ZXingScannerFragmentのOnCreateで
 scanFragment = new ZXingScannerFragment(); 
     FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction(); 
     fragmentTx.Replace(Resource.Id.fragment, scanFragment); 
     fragmentTx.SetTransition(FragmentTransit.FragmentFade); 
     fragmentTx.Commit(); 

私は、ユーザーが何かをスキャンする際、カメラの視野を遮断、ということをしたい何

 frame = (FrameLayout)layoutInflater.Inflate(Resource.Layout.zxingscannerfragmentlayout, viewGroup, false); 
     return frame; 

を持っており、ユーザが走査された物体を保持したい、または廃棄したいと望むかどうかを決定したとき、カメラは再び表示する。

だから私はZxingフラグメントにOnPauseメソッドを呼び出すと、このコードでボタンを可能コードがMainActivity上で検出されたときに呼び出さscann機能、持っている:

  var opts = new MobileBarcodeScanningOptions { 
       PossibleFormats = new List<ZXing.BarcodeFormat> { 
       ZXing.BarcodeFormat.All_1D, 
      } 
      }; 
      scanFragment.StartScanning(result => { 

       if (result == null || string.IsNullOrEmpty(result.Text)) { 
        Toast.MakeText(this, "Scanning Cancelled", ToastLength.Long).Show(); 
        return; 
       } 
       else 
       { 
        _player.Start(); 
        RunOnUiThread(() => codBox.Text = result.Text); 
        RunOnUiThread(() => addBut.Enabled = true); 
        RunOnUiThread(() => delBut.Enabled = true); 
        RunOnUiThread(() => masBut.Enabled = true); 
        RunOnUiThread(() => menBut.Enabled = true); 
        RunOnUiThread(() => buttonDate.Enabled = true); 
        RunOnUiThread(() => finishBut.Enabled = false); 
        scanFragment.OnPause(); 
       } 
      }, opts); 

をそして私は誰別の関数を持っていますZxingフラグメントからOnResumeを呼び出します。

OnPause関数は次のようになります。

 base.OnPause(); 
     if (scanner != null) 
     { 
      frame.RemoveView(scanner); 
      if (!UseCustomOverlayView) 
       frame.RemoveView(zxingOverlay); 
      else if (CustomOverlayView != null) 
       frame.RemoveView(CustomOverlayView); 
      scanner.ShutdownCamera(); 
      scanner = null; 
     } 

問題は、次のとおりです。このコードで OnPause機能が例外「ビュー階層を作成しただけ元のスレッドがその見解に触れることができる」が、私ならば提供しますそれを無視すると、いくつかのランダムな時間がうまく機能します。私はコードを取ることができます、カメラが消えて、オブジェクトを追加または削除し、カメラをもう一度呼び出すと、すべて "5、10 ...行が"未処理の例外:Java.Lang.NullPointerException "アイデアなしでは解雇されており、情報はありません。

私はのような階層の例外を防ぐために何かを行う場合は、次のカメラが消滅

  if (scanner != null) 
      { 
       var myActivity = (MainActivity)this.Activity; 
       myActivity.RunOnUiThread(() => 
       { 
        frame.RemoveView(scanner); 
        if (!UseCustomOverlayView) 
         frame.RemoveView(zxingOverlay); 
        else if (CustomOverlayView != null) 
         frame.RemoveView(CustomOverlayView); 
       }); 
       scanner.ShutdownCamera(); 
       scanner = null; 
      } 

を、例外がthrowedされていないが、私はOnResumeを呼び出すときに、私が最後に検出されたコードの静的な画像を得ることができます。

+1

RuOnUiThreadを使用すると何が起こるかもう少し説明できますか? – Sreeraj

+0

このエラーはAndroid OSのエラーであり、あなたはいつも悪いことが起こることなくそれを無視することはできません... @Sreerajは、あなたが 'RunOnUiThread'をルートとして使用している問題に関して、あなたの修正の。 – SushiHangover

答えて

0

多くの試みの後で、私は自分のアプリの正しい動作として管理されていないクラッシュを使用していたことを実感しました。

私はZxingfragment呼び出しのOnResume関数とOnPause関数(明確に目的を持っているもの)を呼び出す代わりに、関数と停止スキャン機能を直接スキャンします。

関連する問題