私は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を呼び出すときに、私が最後に検出されたコードの静的な画像を得ることができます。
RuOnUiThreadを使用すると何が起こるかもう少し説明できますか? – Sreeraj
このエラーはAndroid OSのエラーであり、あなたはいつも悪いことが起こることなくそれを無視することはできません... @Sreerajは、あなたが 'RunOnUiThread'をルートとして使用している問題に関して、あなたの修正の。 – SushiHangover