私が取り組んでいるアプリのユーザーには、クラッシュの問題があります。これは、コンソールから取得したスタックトレースです。
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)
クラッシュは、5.xを搭載したGalaxyNote3またはGalaxyS4電話を使用しているユーザー、または少なくとも報告されている唯一のユーザーでのみ発生しますが、多く発生しています。フラグメント間の遷移時、またはカメラから戻ってきたときに発生するようです。これが私の移行方法です。
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();
}
これらは、アプリで移行を行う唯一の方法です。だから私はそれがこれらの1つから来ていると思います。しかし、スタックトレースは私が書いたコードに戻らないので、よくわかりません。これはAndroid 5.xの問題であり、修正はありませんでした。したがって、この問題を削除するためのヘルプがあれば素晴らしいと思います。
これは、null
値を使用してremove()
add()
などのメソッドを呼び出しているためです。
そして、replace()
= remove()
-> add()
を1つずつ覚えておいてください。
Android.support.v4.app.Fragment
の代わりにAndroid.app.Fragment
を拡張するフラグメントを使用し、Android.app.FragmentTransaction
の代わりにAndroid.support.v4.app.FragmentTransaction
を使用してみてください
このバグはこの質問ですでに解決されています:
やってみて。