2017-02-21 53 views
6

我正在開發一個應用程序使用Xamarin.Forms跨平臺使用。最近我更新Mac上的Xamarin Studio以及更新NuGet包。Xamarin「試圖調用虛擬方法'void android.view.View.unFocus(android.view.View)'null對象引用」

我現在收到此錯誤:試圖調用空對象引用的虛擬方法'無效android.view.View.unFocus(android.view.View)'。 (請參閱下面的堆棧跟蹤)

當從除根視圖以外的任何頁面導航(或重新呈現)時,會發生這種情況。我不相信我改變了導航或頁面渲染的任何部分。

對不起,如果這有點模糊,從棧跟蹤中可以看出,這不是從我的代碼開始(以任何可追蹤的方式)。我不確定從哪裏開始調試。任何建議都會非常有幫助!

堆棧跟蹤

--- End of managed Java.Lang.NullPointerException stack trace --- 
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.unFocus(android.view.View)' on a null object reference 
    at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4937) 
    at android.view.ViewGroup.removeViewAt(ViewGroup.java:4899) 
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1540) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595) 
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757) 
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355) 
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146) 
    at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008) 
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:158) 
    at android.app.ActivityThread.main(ActivityThread.java:7224) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

編輯:這隻發生在Android上。

編輯:其他信息: 這主要發生在調用Navigation.PushAsync或Navigation.PopAsync(包括用戶後退按鈕按下)時。

這是在我的應用程序中發生的最簡單的例子: 從主屏幕開始,用戶可以採取措施導致QR碼掃描頁面。此QR碼包含有關此驅動程序將提供何種負載的信息。掃描完成後,我保存信息並從導航中彈出掃描頁面,然後自動將它們推送到加載屏幕。數據加載後,我將它們推送到他們需要的信息列表中。 (所以現在導航棧有[main,loading_screen,list_view])如果此時調用了任何Navigation.PopAsync(或PushAsync),那麼應用程序會崩潰。

+0

當你做導航時,你能找到代碼調用unFocus函數的位置嗎? –

+0

我從不直接進行任何未聚焦的調用。它發生在調用Navigation.PushAsync或Navigation.PopAsync(包括用戶後退按鈕)時。注意:我將進行編輯以將其包含在問題中。 – Kallmanation

回答

2

找到解決方案。 簡單的答案是我錯誤地操縱了導航堆棧。 根據VincentH_NET的回答,我應該可以做我最初嘗試做的事情,但是由於Xamarin中的錯誤,我無法做到。這裏的情況是:

的應用始於只有導航堆棧中,我將與M

[ M

在用戶交互表示在主網頁,我會先推加載屏幕,表示爲L,導航堆棧上,而我準備一個條碼掃描頁面。

[ M, L

一旦掃描頁面已經準備好,我自動推送用戶向前,留下導航堆棧像這樣:

[ M, L, S

現在,用戶將掃描包含QR代碼查找信息。之後,他們成功地掃描代碼,我彈出他們回到加載屏幕(這是現在改變用途是加載屏幕上,我給請求到服務器的數據)

[ M, L

我已經裝了之後來自QR碼的相應信息,我將它們推送到數據的列表視圖頁面D

[ M, L, D

在這一點上,我試圖從使用Navigation.RemovePage();導航堆棧中刪除加載頁面L由於裝載頁面不再需要,如果用戶按下後退按鈕,看加載屏幕將會造成混亂沒有加載任何東西。我想要的是一個看起來像這樣的導航堆棧:

[ M, D

但相反,它似乎我的網頁去除損壞的導航堆棧,導致我一直在經歷錯誤。

我的解決方案現在是,而不是試圖從堆棧中刪除加載頁面設置加載頁面自動彈出本身出棧的,如果它沒有實際加載任何東西。

P.S.如果任何人有更深入的瞭解這個問題或更好的最佳實踐這些類型的UI情況,我很想聽到你的答案。

+0

類似的情況我也有。我剛剛刪除了「removepage」代碼,正如你所說的那樣,它工作正常。我使用25.3.1版本,問題仍然存在。這實際上是否意味着我們在使用RemovePage時可能會出現錯誤? – batmaci

相關問題