2015-07-13 4 views
7

Gli utenti dell'applicazione su cui sto lavorando hanno un problema irreversibile. Questa è la traccia dello stack che ottengo dalla console.Frammento di Android null object 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) 

L'incidente accade solo con gli utenti che dispongono di Galaxy Nota3 o Galaxy S4 telefoni con 5.x o almeno quelli nostro l'unico che hanno ottenuto riportato ma ha accadere un sacco. Sembra che si verifichi una transizione tra i frammenti o, a volte, quando si torna dalla fotocamera. Ecco i miei metodi di transizione.

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(); 
} 

Questi sono gli unici metodi che eseguono la transizione nell'app. Quindi presumo che provenga da uno di questi. Ma la traccia dello stack non torna a nessun codice che ho scritto, quindi non sono sicuro. Ho riscontrato problemi analoghi affermando che si tratta di un problema di Android 5.x e non sono state apportate correzioni. Quindi ogni aiuto per rimuovere questo problema sarebbe grande

+0

hai provato a sostituire commitAllowingStateLoss() da commit()? – user2641570

+0

No non ho provato che posso provare a sostituirlo, vedere cosa succede. – sethprogrammer

+0

Ciò ha risolto il problema ma ha causato problemi con i dispositivi più vecchi in caso di arresto anomalo del sistema e altri problemi – sethprogrammer

risposta

15

È perché si sta chiamando remove()add() metodi con valore null ecc.

e si prega di tenere presente che replace() = remove() ->add() uno per uno.