Xamarin Zxing Fragment OnPause只有创建视图层次结构的原始线程才能触及其视图

时间:2016-04-19 08:20:00

标签: android android-fragments xamarin zxing

我正在使用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时,我得到了检测到的最后一个代码的静态图像。

1 个答案:

答案 0 :(得分:0)

经过多次尝试后,我意识到我正在使用非托管崩溃作为我的应用的正确行为。

我所做的不是调用Zxingfragment调用的OnResume和OnPause函数(有明确目标)直接扫描函数和停止扫描函数。