La pile complète comprend uniquement Android code de base:
Java.lang.NullPointerException: Attempt to invoke virtual method 'boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()' on a null object reference
at androidx.fragment.app.Fragment.performDetach(Fragment.Java:2844)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.Java:1033)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.Java:1237)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.Java:434)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.Java:2075)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.Java:1865)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.Java:1820)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.Java:1726)
at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.Java:150)
at Android.os.Handler.handleCallback(Handler.Java:873)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:193)
at Android.app.ActivityThread.main(ActivityThread.Java:6669)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:493)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:858)
Cela se produit lors du remplacement du fragment dans l'activité principale:
Runnable mPendingRunnable = new Runnable() {
@Override
public void run() {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, fragment);
fragmentTransaction.commitAllowingStateLoss();
}
};
J'ai trouvé un morceau de code dans myFragment.onDetach qui provoquait ceci:
Il s'agissait d'une solution de contournement de Obtention de l'erreur "L'activité Java.lang.IllegalStateException a été détruite" lors de l'utilisation d'onglets avec ViewPager
try {
Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
childFragmentManager.setAccessible(true);
childFragmentManager.set(this, null);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
Maintenant, dans androidx, cette solution de contournement n'est pas nécessaire.
Dans le gradle de mon module, je l'ai corrigé en revenant
implementation 'androidx.appcompat:appcompat:1.1.0-beta01'
à
implementation 'androidx.appcompat:appcompat:1.1.0-alpha05'
(La réponse ci-dessus avec le truc childFragmentManager n'a pas aidé.)
Je me disputais ces derniers jours sur ce problème et j'ai finalement trouvé la solution. Ici, j'utilise Gradle
implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
et j'ai remplacé mon fragment en utilisant ce code.
getActivity().getSupportFragmentManager().beginTransaction().detach(new KiKorbo()).replace(R.id.calendar1, caldroidFragment).attach(caldroidFragment)
.addToBackStack(null).commit();
Ici, KiKorbo.Java était mon fragment parent et j'ai remplacé caldroidFragment.