it-roy-ru.com

Android Фрагмент нулевой объект mNextAnim Внутренняя 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)

Сбой происходит только с пользователями, у которых есть телефоны Galaxy Note3 или Galaxy S4 с 5.x или, по крайней мере, те, которые являются нашими единственными, о которых сообщили, но это случалось много. Кажется, это происходит при переходе между фрагментами или иногда при возвращении из камеры. Вот мои методы перехода. 

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

Это единственные методы, которые выполняют переход в приложении. Поэтому я предполагаю, что это происходит от одного из них. Но трассировка стека не возвращает ни к одному написанному мною коду, поэтому я не уверен. Я обнаружил похожие проблемы, сказав, что это проблема Android 5.x, и не было никакого решения. Так что любая помощь по устранению этой проблемы была бы отличной 

8
sethprogrammer

Это потому, что вы вызываете методы remove()add() и т.д. Со значением null.

и имейте в виду, что replace() = remove()-> add() один за другим.

17
GreenRobo

Попробуйте использовать фрагменты, расширяющие Android.support.v4.app.Fragment вместо Android.app.Fragment, и используйте Android.app.FragmentTransaction вместо Android.support.v4.app.FragmentTransaction

Эта ошибка уже решена в этом вопросе:

Попытка удалить фрагмент из вида дает мне исключение NullPointerException на mNextAnim

Попробуйте это.

3
ArtKorchagin