Java Android片段空对象mNextAnim内部崩溃

Java Android片段空对象mNextAnim内部崩溃,java,android,android-fragments,android-studio,back-stack,Java,Android,Android Fragments,Android Studio,Back Stack,我正在使用的应用程序的用户出现崩溃问题。这是我从控制台得到的堆栈跟踪 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:92

我正在使用的应用程序的用户出现崩溃问题。这是我从控制台得到的堆栈跟踪

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();
}
public void PopBackBackbackToor(字符串popBackFragmentName,字符串secondPopBackFragment)
{
int backStackId=0;
int backStackCount=getSupportFragmentManager().getBackStackEntryCount();
List fragments=getSupportFragmentManager().getFragments();
对于(int k=(backStackCount-1);k>0;k--)
{
字符串afFragmentClass=fragments.get(k.getClass().toString();
String[]splitList=affragmentclass.split(“\\”);
AfFragmentClass=splitList[splitList.length-1];
boolean FirstOptionRue=afFragmentClass.equalsIgnoreCase(popBackFragmentName);
boolean SecondOptionRue=afFragmentClass.equalsIgnoreCase(secondPopBackFragment);
如果((第一个选项)| |(第二个选项))
{
backStackId=getSupportFragmentManager().getBackStackEntryAt(k).getId();
打破
}
}
getSupportFragmentManager().popBackStack(backStackId,android.support.v4.app.FragmentManager.POP_BACK_STACK_include);//立即
}
public void PopBackbackForReview(字符串popBackFragmentName)
{
int backStackId=0;
int backStackCount=getSupportFragmentManager().getBackStackEntryCount();
List fragments=getSupportFragmentManager().getFragments();
对于(int k=(backStackCount-1);k>0;k--)
{
字符串afFragmentClass=fragments.get(k.getClass().toString();
String[]splitList=affragmentclass.split(“\\”);
AfFragmentClass=splitList[splitList.length-1];
if(afFragmentClass.equalsIgnoreCase(popBackFragmentName))
{
backStackId=getSupportFragmentManager().getBackStackEntryAt(k).getId();
打破
}
}
getSupportFragmentManager().popBackStack(backStackId,android.support.v4.app.FragmentManager.POP_BACK_STACK_包括在内);
}
公共无效传输登录页面()
{
Fragment newFragment=新登录页面();
FragmentTransaction=getSupportFragmentManager().beginTransaction();
事务.replace(R.id.frame_容器,newFragment);
//transaction.addToBackStack(空);
transaction.commitAllowingStateLoss();
}
公共无效传输新闻屏幕(片段newFragment,Bundle Bundle)
{
FragmentTransaction=getSupportFragmentManager().beginTransaction();
如果(currentFragment!=null)
{
事务。删除(currentFragment);
}
currentFragment=newFragment;
if(bundle!=null)
{
setArguments(bundle);
}
事务.replace(R.id.frame_容器,newFragment);
事务。addToBackStack(“虚拟”);
transaction.commitAllowingStateLoss();
}
公共无效传输NewScreen和EmptyStack(片段newFragment)
{
getSupportFragmentManager();
currentFragment=newFragment;
FragmentTransaction=getSupportFragmentManager().beginTransaction();
事务.replace(R.id.frame_容器,newFragment);
transaction.addToBackStack(空);
transaction.commitAllowingStateLoss();
}

这些是在应用程序中进行转换的唯一方法。所以我假设它来自其中一个。但是堆栈跟踪不会返回到我编写的任何代码,所以我不确定。我发现了类似的问题,说这是安卓5.x的问题,没有修复。因此,消除此问题的任何帮助都将是巨大的

尝试使用片段扩展
android.support.v4.app.Fragment
而不是
android.app.FragmentTransaction
,并使用
android.support.v4.app.FragmentTransaction

此问题中已解决此错误:


试试看。

这是因为您正在使用
null
值调用
remove()
add()
等方法。


请记住,
replace()
=
remove()
->
add()
一个接一个。

您是否尝试过用commit()替换commitAllowingStateLoss()?没有,我还没有尝试过,我可以尝试替换它,看看会发生什么。这修复了它,但导致了旧设备崩溃和其他问题