web-dev-qa-db-fra.com

Fragment Android Objet null mNextAnim Internal Crach

Les utilisateurs de l'application sur laquelle je travaille ont un problème de plantage. C'est la trace de pile que je reçois de la console.

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'accident ne survient que chez les utilisateurs de téléphones Galaxy Note3 ou Galaxy S4 avec 5.x ou du moins, ceux-ci sont les seuls à avoir été signalés, mais cela s'est souvent produit. Cela semble se produire lors de la transition entre fragments ou parfois lors du retour de la caméra. Voici mes méthodes de transition. 

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

Ce sont les seules méthodes qui font la transition dans l'application. Donc, je suppose que cela vient d'un de ceux-ci. Mais la trace de la pile ne renvoie à aucun code que j'ai écrit, donc je ne suis pas sûr. J'ai trouvé des problèmes similaires en disant qu'il s'agissait d'un problème sous Android 5.x et qu'il n'y avait pas de solution. Donc, toute aide pour éliminer ce problème serait géniale 

8
sethprogrammer

C'est parce que vous appelez des méthodes remove()add() etc. avec null valeur.

et rappelez-vous que replace() = remove()-> add() un à un.

17
GreenRobo

Essayez d’utiliser des fragments prolongeant Android.support.v4.app.Fragment au lieu de Android.app.Fragment et utilisez le Android.app.FragmentTransaction au lieu de Android.support.v4.app.FragmentTransaction.

Ce bug déjà résolu dans cette question:

Essayer de supprimer un fragment de la vue me donne une exception NullPointerException sur mNextAnim

Essaye le.

3
ArtKorchagin