我正在爲Xamarin和Zxing庫開發android代碼欄應用程序。 我的目標是在同一視圖中使用代碼欄視圖的一半屏幕,另一半使用按鈕將已掃描對象添加或刪除到列表中。Xamarin Zxing片段OnPause只有創建視圖層次結構的原始線程可以觸及其視圖
在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功能,誰調用在斑馬線片段的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函數給出異常的「創建視圖層次可以觸摸其觀點只有原來的線程」,但如果我忽略它一切隨機時間運作良好。我可以取代碼,相機消失,然後添加或刪除對象,再次調用相機,並且所有工作正常5 ... 10 ... 15次,直到我得到一個「未處理的異常: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;
}
相機消失,沒有異常被扔,但是當我叫我的onResume得到檢測到最後的代碼的靜態圖像。
你能解釋一下當你使用RuOnUiThread時會發生什麼嗎? – Sreeraj
這個錯誤是一個Android操作系統的錯誤,你不能真正忽略它,沒有不好的事情在某個時候發生......正如@Sreeraj提到的,你可以提供更多關於使用'RunOnUiThread'的問題,因爲這是根的修復。 – SushiHangover