2017-02-21 3 views
6

私はXamarin.Formsをクロスプラットフォームで使用するために開発中です。最近、MacでXamarin Studioをアップデートし、NuGetパッケージをアップデートしました。"Xamarin"がnullメソッド参照を呼び出すようにしようとしました "

このエラーが発生しました。ヌルオブジェクトリファレンスで仮想メソッド 'void 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) 

EDIT:これはAndroid上で発生します。

EDIT:その他の情報: これは、主にNavigation.PushAsyncまたはNavigation.PopAsync(ユーザーの戻るボタンが押されていることを含む)を呼び出すときに発生します。

私のアプリでこれが起こっている最も単純な例は次のとおりです。 ホーム画面から、ユーザーはQRコードスキャンページに進むための行動を取ることができます。このQRコードには、このドライバが配信する負荷に関する情報が含まれています。スキャンした後、情報を保存し、ナビゲーションからスキャンページをポップしてから自動的に読み込み画面にプッシュします。データのロード後、必要な情報のリストにそれらをプッシュします。 (ナビゲーションスタックに[main、loading_screen、list_view]があります)この時点でNavigation.PopAsync(またはPushAsync)が呼び出されると、アプリケーションがクラッシュします。

+0

ナビゲーションを実行すると、コードがunFocus関数を呼び出す場所を見つけることができますか? –

+0

私は決してunFocus呼び出しを直接行いません。これは、Navigation.PushAsyncまたはNavigation.PopAsync(ユーザーの戻るボタンの押下を含む)の呼び出し時に発生します。注:質問にこれを含めるように編集します。 – Kallmanation

答えて

2

解決策が見つかりました。 簡単な答えは、ナビゲーションスタックを誤って操作していたことです。 VincentH_NETの答えによると、もともと私がやろうとしたことができるはずですが、Xamarinのバグのせいで私はできません。ここでの状況は次のとおりです。

アプリは、私がユーザーとの対話の際にM

[ M

で表しますナビゲーションスタック、上だけメインページで始まり、私が最初にロード画面をプッシュします、 Lと表示され、バーコードスキャニングページを作成しながらナビゲーションスタックに表示されます。

[ M, L

スキャンページの準備ができたら、私は自動的にそのようにナビゲーションスタックを残し、前方のユーザーをプッシュ:

[ M, L, S

今、ユーザーが検索情報を含むQRコードをスキャンします。彼らは成功したコードをスキャンした後、私はロードした後、私は(今私は自分のデータのために、サーバへのリクエストを行いながら、ロード画面になるように再利用される)ロード画面

[ M, L

にそれらをバックポップQRコードからの対応する情報を、データのリストビューにプッシュします。ページD。私はロードページがもはや必要とされているので、Navigation.RemovePage();を使用してナビゲーションスタックから読み込んでページLを削除しないようにしようとし、ユーザーはロード画面を見るために[戻る]ボタンを押した場合は混乱するでしょう。この時点で

[ M, L, D

それは何もロードしていません。私が望んでいたことは、このように見えたナビゲーションスタックだった:

[ M, D

しかし、その代わりに、私のページの削除は、私が経験してきたエラーにつながる、ナビゲーションスタックを破損しているようです。

私の解決策は、読み込みページをスタックから削除して、読み込みページが実際に何もロードされていない場合にスタックから自動的にポップするように設定するのではなく、にすることです。

P.S.誰かがこの種のUI状況に関するこの問題またはより良いベストプラクティスについて深く理解していれば、私はあなたの答えを聞いてみたいです。

+0

同様のシナリオもあります。私はちょうど "removepage"コードを削除し、うまくいきました。私は25.3.1バージョンを使用しており、問題は依然として続きます。それは実際にRemovePageを使用したときにエラーが予想されることを意味しますか? – batmaci

4

これはXamarinで確認バグが2.3.3.193を形成している。

Bug 53179 - PopAsync crashing after RemovePage when support packages are updated to 25.1.1

だから何あなたがやったことは間違っていませんでした。あなたの答えは有効な回避策です。

+0

以前のAndroidサポートのバージョンを使用して戻ったのですか?あなたの経験からどのバージョンを安全に使用できますか? – batmaci

+0

こんにちは、サポートパッケージのバージョンは25.4.0.2です。このバージョンでもこの問題が発生しています。 – Deepak