2015-07-13 9 views
7

Użytkownicy aplikacji, nad którą pracuję, mają awarię. To jest ślad stosu, który otrzymuję z konsoli.Android Fragment obiektu o wartości null mNextAnim Internal Crach

java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference 
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:924) 
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1605) 
at android.support.v4.app.FragmentManagerImpl$4.run(FragmentManager.java:532) 
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501) 
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458) 
at android.os.Handler.handleCallback(Handler.java:739) 
at android.os.Handler.dispatchMessage(Handler.java:95) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5942) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194) 

Wypadek zdarza się tylko z użytkownikami, którzy mają Galaxy Uwaga 3 lub Galaxy S4 telefony z 5.x lub przynajmniej tych naszego jedynego że mam zgłaszane ale ma zdarzyć się wiele. Wydaje się, że dzieje się to podczas przechodzenia pomiędzy fragmentami lub czasami po powrocie z kamery. Oto moje metody przejściowe.

public void popBackStackToOr(String popBackFragmentName, String secondPopBackFragment) 
{ 
    int backStackId = 0; 
    int backStackCount = getSupportFragmentManager().getBackStackEntryCount(); 

    List<Fragment> fragments = getSupportFragmentManager().getFragments(); 

    for (int k = (backStackCount - 1); k > 0; k--) 
    { 
     String aFragmentClass = fragments.get(k).getClass().toString(); 
     String[] splitList = aFragmentClass.split("\\."); 
     aFragmentClass = splitList[splitList.length - 1]; 

     boolean firstOptionTrue = aFragmentClass.equalsIgnoreCase(popBackFragmentName); 
     boolean secondOptionTrue = aFragmentClass.equalsIgnoreCase(secondPopBackFragment); 

     if ((firstOptionTrue) || (secondOptionTrue)) 
     { 
      backStackId = getSupportFragmentManager().getBackStackEntryAt(k).getId(); 
      break; 
     } 
    } 

    getSupportFragmentManager().popBackStack(backStackId, android.support.v4.app.FragmentManager.POP_BACK_STACK_INCLUSIVE); //Immediate 
} 

public void popBackStackForReview(String popBackFragmentName) 
{ 
    int backStackId = 0; 
    int backStackCount = getSupportFragmentManager().getBackStackEntryCount(); 

    List<Fragment> fragments = getSupportFragmentManager().getFragments(); 

    for (int k = (backStackCount - 1); k > 0; k--) 
    { 
     String aFragmentClass = fragments.get(k).getClass().toString(); 
     String[] splitList = aFragmentClass.split("\\."); 
     aFragmentClass = splitList[splitList.length - 1]; 
     if (aFragmentClass.equalsIgnoreCase(popBackFragmentName)) 
     { 
      backStackId = getSupportFragmentManager().getBackStackEntryAt(k).getId(); 
      break; 
     } 
    } 

    getSupportFragmentManager().popBackStack(backStackId, android.support.v4.app.FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 

public void transitionToLoginPage() 
{ 
    Fragment newFragment = new LoginPage(); 

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

    transaction.replace(R.id.frame_container, newFragment); 
    //transaction.addToBackStack(null); 

    transaction.commitAllowingStateLoss(); 
} 

public void transitionToNewScreen(Fragment newFragment, Bundle bundle) 
{ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

    if (currentFragment != null) 
    { 
     transaction.remove(currentFragment); 
    } 

    currentFragment = newFragment; 

    if (bundle != null) 
    { 
     newFragment.setArguments(bundle); 
    } 

    transaction.replace(R.id.frame_container, newFragment); 
    transaction.addToBackStack("dummy"); 

    transaction.commitAllowingStateLoss(); 
} 

public void transitionToNewScreenAndEmptyStack(Fragment newFragment) 
{ 
    getSupportFragmentManager().popBackStack(0, android.support.v4.app.FragmentManager.POP_BACK_STACK_INCLUSIVE); 

    currentFragment = newFragment; 

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.replace(R.id.frame_container, newFragment); 
    transaction.addToBackStack(null); 
    transaction.commitAllowingStateLoss(); 
} 

Są to jedyne metody, które wprowadzają zmiany w aplikacji. Zakładam, że pochodzi z jednego z nich. Ale ślad stosu nie wraca do żadnego kodu, który napisałem, więc nie jestem pewien. Znalazłem podobne problemy, mówiąc, że jest to problem z Androidem 5.x i nie było żadnej poprawki. Tak jakiejkolwiek pomocy w celu usunięcia tego problemu byłoby świetnie

+0

Czy próbowałeś zastąpić commitAllowingStateLoss() przez commit()? – user2641570

+0

Nie, nie próbowałem, mogę spróbować go zastąpić, zobacz co się stanie. – sethprogrammer

+0

Naprawiono błąd, ale spowodował on problemy z starszymi awariami urządzeń i innymi problemami – sethprogrammer

Odpowiedz

15

To dlatego, że dzwonisz do metod o wartości remove()add().

i należy pamiętać, że replace() = ->add() jeden po drugim.

Powiązane problemy