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
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.
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.