2014-04-13 20 views
6

Mam dość nieokreślony błąd w aplikacji na Androida, nad którą pracuję. Mam fragment, który z kolei zawiera ViewPagera, który jest wspierany przez FragmentStatePagerAdapter. Pager zawiera dwa fragmenty.Nullpointerexception na dispatchDraw z ViewPager w zagnieżdżonym fragmencie z PageTransformer

Za każdym razem, gdy próbuję dodać PageTransformer (używając tych z witryny dla programistów Androida: http://developer.android.com/training/animation/screen-slide.html), wszystko działa poprawnie, dopóki nie spróbuję odejść od fragmentu zawierającego widok strony (backpress lub zwykły). Błąd, który otrzymuję, jest następujący. Nie mogę naprawdę wyśledzić, co powoduje to x_x. Fragment kodu konstrukcji pagera na dole. budowa

Process: edu.utcs.android, PID: 11728 
    java.lang.NullPointerException 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2946) 
      at android.view.View.draw(View.java:14476) 
      at android.support.v4.view.ViewPager.draw(ViewPager.java:2171) 
      at android.view.View.getDisplayList(View.java:13370) 
      at android.view.View.getDisplayList(View.java:13412) 
      at android.view.View.draw(View.java:14190) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3103) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940) 
      at android.view.View.draw(View.java:14476) 
      at android.widget.FrameLayout.draw(FrameLayout.java:472) 
      at android.view.View.getDisplayList(View.java:13370) 
      at android.view.View.getDisplayList(View.java:13412) 
      at android.view.View.draw(View.java:14190) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3103) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940) 
      at android.view.View.getDisplayList(View.java:13365) 
      at android.view.View.getDisplayList(View.java:13412) 
      at android.view.View.draw(View.java:14190) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3103) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2959) 
      at android.view.View.getDisplayList(View.java:13365) 
      at android.view.View.getDisplayList(View.java:13412) 
      at android.view.View.draw(View.java:14190) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3103) 
      at android.support.v4.widget.DrawerLayout.drawChild(DrawerLayout.java:870) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940) 
      at android.view.View.getDisplayList(View.java:13365) 
      at android.view.View.getDisplayList(View.java:13412) 
      at android.view.View.draw(View.java:14190) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3103) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940) 
      at android.view.View.getDisplayList(View.java:13365) 
      at android.view.View.getDisplayList(View.java:13412) 
      at android.view.View.draw(View.java:14190) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3103) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940) 
      at android.view.View.draw(View.java:14476) 
      at com.android.internal.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:381) 
      at android.view.View.getDisplayList(View.java:13370) 
      at android.view.View.getDisplayList(View.java:13412) 
      at android.view.View.draw(View.java:14190) 
      at android.view.ViewGroup.drawChild(ViewGroup.java:3103) 
      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940) 
      at android.view.View.draw(View.java:14476) 
      at android.widget.FrameLayout.draw(FrameLayout.java:472) 
      at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2324) 
      at android.view.View.getDisplayList(View.java:13370) 
      at android.view.View.getDisplayList(View.java:13412) 
      at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1577) 
      at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1449) 
      at android.view.ViewRootImpl.draw(ViewRootImpl.java:2410) 
      at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2282) 
      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1912) 
      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1022) 
      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5708) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
      at android.view.Choreographer.doFrame(Choreographer.java:532) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:5083) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593) 
      at de.robv.andro 

Pager:

mAdapter = new LabPagerAdapter(getChildFragmentManager()); 
     mPager.setAdapter(mAdapter); 
     mPager.setPageTransformer(false, new ZoomOutPageTransformer()); 
     mPager.setCurrentItem(mLabPosition); 

Próbowałem rozmieszczanie kilka linii w przypadku był to jakiś rodzaj wyścigu, a także próbowali odwrócenia animacji („false” logiczną na 3 linii), ale bez powodzenia.

EDIT

Z niektórych prób i błędów, a niektóre pomoc user2152081, Poszedłem z hacky obejście nadrzędnymi klasę ViewPager z własną rękę, i owijając super połączenie w losowaniu() w blok try/catch.

@Override 
public void draw(Canvas canvas) { 
    try { 
     super.draw(canvas); 
    } catch (NullPointerException e) { 
     Log.d("ViewPager", "Nullpointer skipped"); 
    } 
} 
+1

Dzięki @pandanomic że udało się rozwiązać moją sprawę, jak również. – zIronManBox

+0

Masz ten sam problem, jeśli zastąpiłeś getChildFragmentManager() przez getActivity.getFragmentManager(). Napotkałem ten sam problem, jeśli użyłem getChildFragmentManager(), ale znika, jeśli używam actVitiy fragmentManager. Nie mam pojęcia, czy to pomoże, ale rozwiązał mój problem. –

+0

@ JM.Pascal Próbowałem tego, ale spowodowało to inne problemy z powodu ponownego dodania tych fragmentów strony podglądu, jeśli wyszedłem i wróciłem do tego fragmentu. Zagnieżdżony widok podglądu powinien pobrać menedżer potomka, a nie zwykły –

Odpowiedz

6

Nie mam wystarczającej liczby przedstawicieli do komentowania, więc odpowiem tutaj.

Wpadłem na dokładnie ten sam problem. Patrząc na źródło dla ViewGroup, działało przez dzieci z android.support.v4.view.ViewPager i trafiając tam NPE. Jak stwierdziłeś, usunięcie transformatora strony zadziałało, podobnie jak usunięcie PagerTabStrip dla mnie. Patrzę na to teraz, ale wygląda to na jakąś niezgodność pomiędzy transformatorem strony a PagerTabStrip.

szczególności, gdy ViewPager proszony jest przerysować się na górze ślad stosu:

at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2946) 
at android.view.View.draw(View.java:14476) 
at android.support.v4.view.ViewPager.draw(ViewPager.java:2171) 

Dla mnie w tym momencie ViewPager ma tylko jedno dziecko - na PagerTabStrip. W dispatchDraw w ViewGroup, to gdzie NPE wyskakuje:

for (int i = 0; i < count; i++) { 
    final View child = children[getChildDrawingOrder(count, i)]; 
    if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { 
     more |= drawChild(canvas, child, drawingTime); 
    } 
} 

Gdzie dzieci [] zawiera PagerTabStrip jak to 0-cia wpis, z jakiegoś powodu, dzieci [getChildDrawingOrder (liczyć, i)] ocenia null.

getchildDrawingOrder(count, i) 

nie jest przeładowany w mojej implementacji, więc po prostu zwraca i. To poza mną, dlaczego jest to wartość null - z pewnością wydaje się, że powinna zwrócić PagerTabStrip, ale nie jest i generuje NPE podczas próby uzyskania dostępu do elementów children [0].

Nie mam dla ciebie rozwiązania, ale mam nadzieję, że jest to podobne do tego, na co natknąłeś się. Daj mi znać, jeśli coś odkryjesz.

EDIT

Nie pewny dlaczego, ale zastępując mój ViewPager z tym wydaje się być rozwiązany katastrofę:

package ca.test; 

import android.content.Context; 
import android.support.v4.view.ViewPager; 
import android.util.AttributeSet; 

public class TestViewPager extends ViewPager { 

    public TestViewPager(Context context) { 
     super(context); 
    } 

    public TestViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected int getChildDrawingOrder(int childCount, int i) { 
     return i; 
    } 

} 
+1

Dziękuję bardzo! Zastąpienie getChildDrawingOrder (...) naprawiło problem dla mnie! –

+0

Właściwie to nie całkowicie rozwiązało problem. Tylko druga (ostatnia) strona w oknie podglądu byłaby klikalna, a nawet jeśli kliknęłabym na górnej stronie, nadal rejestrowałaby kliknięcia, tak jakbym znajdowała się na drugiej stronie. Robiąc to jednak w niestandardowej klasie viewpager naprawiono wszystko. Jest cholernie jak diabli, ale działa. Zaktualizuję swój wpis o to @Override publiczne losowanie void (płótno) { try { super.draw (płótno); } catch (NullPointerException e) { Log.d ("ViewPager", "Nullpointer skipped"); } } –

+0

Tak, to na pewno nie wygląda tak, jak powinno być zrobione, ale nie mogłem znaleźć niczego poza twoją pocztą opisującą problem. Wygląda na to, że wielu ludzi się na to nie natknęło. Jeśli natkniesz się na lepsze rozwiązanie, daj mi znać, ponieważ teraz używam tego rozwiązania. – user2152081

Powiązane problemy