我正在使用Xamarin和Zxing库为Android开发代码栏应用程序。 我的目标是使用代码栏视图在同一视图中显示屏幕的一半,另一半使用按钮将扫描对象添加或删除到列表中。
在MainActivity OnCreate函数中,我有:
scanFragment = new ZXingScannerFragment();
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
fragmentTx.Replace(Resource.Id.fragment, scanFragment);
fragmentTx.SetTransition(FragmentTransit.FragmentFade);
fragmentTx.Commit();
在ZXingScannerFragment OnCreate中我有
frame = (FrameLayout)layoutInflater.Inflate(Resource.Layout.zxingscannerfragmentlayout, viewGroup, false);
return frame;
我想要的是,当用户扫描相机视图关闭的东西时,然后当用户决定是否要保留或丢弃扫描对象时,相机会再次显示。
所以我在MainActivity上检测到代码时调用了scann函数,该函数调用Zxing片段中的OnPause方法并使用以下代码启用按钮:
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函数提供了一个&#34;只有创建视图层次结构的原始线程才能触及其视图&#34;例外,但如果我忽略它,一切随机时间都很好。我可以拿一个代码,相机消失,然后添加或删除对象,再次调用相机,所有工作正常5 ... 10 ...连续15次,直到我得到一个&#34;未处理的异常:Java.Lang .NullPointerException&#34;没有想法被解雇,没有更多信息。
如果我采取措施防止层次结构异常,例如:
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;
}
相机消失,没有异常被抛出但是当我调用OnResume时,我得到了检测到的最后一个代码的静态图像。
答案 0 :(得分:0)
经过多次尝试后,我意识到我正在使用非托管崩溃作为我的应用的正确行为。
我所做的不是调用Zxingfragment调用的OnResume和OnPause函数(有明确目标)直接扫描函数和停止扫描函数。