wake-up-neo.net

Android-Fragment-Nullobjekt mNextAnim Interner Crach

Benutzer der App, an der ich arbeite, haben ein Absturzproblem. Dies ist die Stapelablaufverfolgung, die ich von der Konsole erhalte.

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)

Der Absturz tritt nur bei Benutzern auf, die über Galaxy Note3- oder Galaxy S4-Telefone mit 5.x verfügen, oder zumindest bei denen, die als einzige gemeldet wurden, aber es ist viel passiert. Es scheint beim Übergang zwischen Fragmenten oder manchmal beim Zurückkehren von der Kamera zu passieren. Hier sind meine Übergangsmethoden.

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

Dies sind die einzigen Methoden, die in der App übergehen. Ich gehe also davon aus, dass es von einem von diesen kommt. Der Stack-Trace geht jedoch nicht auf den Code zurück, den ich geschrieben habe, daher bin ich mir nicht sicher. Ich habe ähnliche Probleme festgestellt, die besagen, dass dies ein Android 5.x-Problem ist und es keine Lösung gab. Daher wäre jede Hilfe zum Entfernen dieses Problems großartig

8
sethprogrammer

Dies liegt daran, dass Sie remove()add() usw. Methoden mit dem Wert null aufrufen.

und bedenken Sie bitte, dass replace() = remove()-> add() eins nach dem anderen.

17
GreenRobo

Versuchen Sie, Fragmente zu verwenden, die Android.support.v4.app.Fragment anstelle von Android.app.Fragment erweitern, und verwenden Sie den Android.app.FragmentTransaction anstelle von Android.support.v4.app.FragmentTransaction.

Dieser Fehler wurde bereits in dieser Frage behoben:

Der Versuch, Fragment aus der Ansicht zu entfernen, gibt mir NullPointerException auf mNextAnim

Versuch es.

3
ArtKorchagin