2017-02-21 13 views
6

Pracuję nad aplikacją przy użyciu Xamarin.Forms do użytku na wielu platformach. Niedawno zaktualizowałem Xamarin Studio na Macu wraz z aktualizacją pakietów NuGet.Xamarin "próba wywołania metody wirtualnej" void android.view.View.unFocus (android.view.View) "przy odwołaniu do obiektu zerowego"

Otrzymuję teraz ten błąd: próba wywołania metody wirtualnej "void android.view.View.unFocus (android.view.View)" na odwołaniu do obiektu zerowego. (Zobacz opis stosu poniżej)

Występuje podczas nawigacji z dala od (lub ponownego renderowania) dowolnej strony z wyjątkiem widoku głównego. Nie wierzę, że zmieniłem jakąkolwiek część mojej nawigacji lub renderowania strony.

Przykro mi, jeśli to trochę niejasne, wynika to ze śladu stosu, że to nie zaczyna się od mojego kodu (w jakikolwiek identyfikowalny sposób). I nie jestem pewien, gdzie rozpocząć debugowanie. Każda rada byłaby bardzo pomocna!

Śledzenie stosu

--- 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: Dzieje się tak tylko na Androidzie.

EDYCJA: Dodatkowa informacja: Zdarza się to głównie podczas połączenia z Nawigacją.PushAsync lub Navigation.PopAsync (w tym naciśnięcie przycisku wstecz).

Oto najprostszy przykład tego występującego w mojej aplikacji: Począwszy od ekranu głównego, użytkownik może podjąć działanie prowadzące do strony skanowania kodu QR. Ten kod QR zawiera informacje na temat obciążenia, które ten sterownik będzie dostarczał. Po zeskanowaniu zapisuję informacje i pop strony skanowania z nawigacji, a następnie automatycznie popychać je do ekranu ładowania. Po załadowaniu danych popycham je do listy potrzebnych informacji. (Więc teraz stos nawigacyjny ma [main, loading_screen, list_view]) Jeśli w tym momencie zostanie wywołana jakakolwiek Nawigacja.PopAsync (lub PushAsync), to aplikacja ulega awarii.

+0

Po uruchomieniu nawigacji można znaleźć miejsce, w którym kod wywołuje funkcję unFocus? –

+0

Nigdy nie wykonuję żadnych połączeń nieostrych bezpośrednio. Zdarza się to po wywołaniu funkcji Navigation.PushAsync lub Navigation.PopAsync (w tym naciśnięcie przycisku wstecz). Uwaga: dokonam edycji, aby uwzględnić to w pytaniu. – Kallmanation

Odpowiedz

2

Rozwiązanie znalezione. Najprostszą odpowiedzią jest niepoprawne manipulowanie stosem nawigacyjnym. Zgodnie z odpowiedzią VincentH_NET, powinienem być w stanie zrobić to, co pierwotnie próbowałem zrobić, ale z powodu błędu w Xamarin nie mogę. Oto sytuacja:

Aplikacja rozpoczyna się tylko na stronie głównej na stosie nawigacyjny, który będę oznaczać ze M

[ M

Po interakcji użytkownika, będę najpierw nacisnąć ekran ładowania, oznaczony przez L, na stos nawigacyjny, podczas gdy ja przygotowuję stronę do skanowania kodów kreskowych.

[ M, L

Gdy strona skanowania jest gotowy, automatycznie przesunąć użytkownika do przodu, pozostawiając stos nawigacji tak:

[ M, L, S

Teraz użytkownik będzie zeskanować QR kod zawierający informację odnośnika .Po ich pomyślnym skanowanie kodu, pop je z powrotem do ekranu ładowania (co jest teraz repurposed się ekran ładowania, a ja żądań do serwera w celu ich danych)

[ M, L

Po załadowaniu odpowiednie informacje z kodu QR, popycham je do widoku listy danych, strona D.

[ M, L, D

W tym momencie próbowałem usunąć Ładowanie strony L ze stosu nawigacji przy użyciu Navigation.RemovePage(); ponieważ Ładowanie strony nie jest już potrzebne i byłoby mylące, jeżeli użytkownik nacisnął przycisk Wstecz, aby wyświetlić ekran ładowania to ładowanie niczego. Co chciałem był stos nawigacyjny, który wyglądał tak:

[ M, D

Zamiast jednak wydaje się moja strona usuwanie uszkodzonych stos nawigacji, co prowadzi do błędów, jakie przeżywa.

Moje rozwiązanie polega na tym, że zamiast próbować usunąć stronę ładującą ze stosu, aby strona ładująca automatycznie wyskoczyła ze stosu, jeśli faktycznie nie ładuje niczego.

P.S. jeśli ktokolwiek ma więcej dogłębnego zrozumienia tego problemu lub lepszych najlepszych praktyk dla tego typu sytuacji w UI, bardzo chciałbym usłyszeć twoje odpowiedzi.

+0

podobny scenariusz mam też. Właśnie usunąłem kod "removepage" i, jak powiedziałeś, wszystko działało dobrze. Używam wersji 25.3.1 i problem nadal występuje. Czy to oznacza, że ​​możemy oczekiwać błędu, gdy używamy RemovePage? – batmaci

4

jest to potwierdzone bug w Xamarin Forms 2.3.3.193:

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

Więc czego nie było nieprawidłowe; jednak twoja odpowiedź jest prawidłowym rozwiązaniem.

+0

Czy wróciłeś do poprzedniej wersji wsparcia dla systemu Android? która wersja jest bezpieczna w użyciu? – batmaci

+0

Witam, używam wersji pakietu pomocy technicznej to 25.4.0.2. W tej wersji również otrzymuję ten problem. – Deepak

Powiązane problemy