【问题标题】:After migrating to AndroidX application crashes with Attempt to invoke androidx.fragment.app.FragmentManagerImpl.isDestroyed() on a null ref迁移到 AndroidX 应用程序崩溃后,尝试在空 ref 上调用 androidx.fragment.app.FragmentManagerImpl.isDestroyed()
【发布时间】:2019-06-16 11:37:36
【问题描述】:

全栈仅包含android核心代码:

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)

主要活动中替换片段时会发生这种情况:

Runnable mPendingRunnable = new Runnable() {
            @Override
            public void run() {
                FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
                fragmentTransaction.replace(R.id.frame, fragment);
                fragmentTransaction.commitAllowingStateLoss();
            }
        };

【问题讨论】:

  • 我尝试不使用 Runnable,但结果相同。原因可能在其他地方。

标签: java android androidx


【解决方案1】:

我在 myFragment.onDetach 中发现了一段导致此问题的代码:

这是来自Getting the error "Java.lang.IllegalStateException Activity has been destroyed" when using tabs with 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);
        }

现在,在 androidx 中,不需要这种解决方法。

【讨论】:

  • 非常感谢,我遇到了完全相同的问题。
  • 我相信这应该是公认的答案,在我们的代码中发现了导致此问题的相同 sn-p。
  • 谢谢。你拯救了我的一天。 :)
  • 非常感谢。你拯救了我的一天
【解决方案2】:

在我的模块的 gradle 中,我通过还原来修复它

implementation 'androidx.appcompat:appcompat:1.1.0-beta01'

implementation 'androidx.appcompat:appcompat:1.1.0-alpha05'

(上面对 childFragmentManager 的回答没有帮助。)

【讨论】:

【解决方案3】:

前几天我一直在纠结这个问题,最后我找到了解决方案。 这里我用的是gradle

implementation 'androidx.constraintlayout:constraintlayout:1.1.2'

我用这段代码替换了我的片段。

 getActivity().getSupportFragmentManager().beginTransaction().detach(new    KiKorbo()).replace(R.id.calendar1, caldroidFragment).attach(caldroidFragment)
            .addToBackStack(null).commit();

这里 KiKorbo.java 是我的父片段,我替换了 caldroidFragment。

【讨论】:

    【解决方案4】:

    在我的模块的 gradle 中,我通过还原来修复它

    implementation 'androidx.appcompat:appcompat:1.2.5'
    

    implementation 'androidx.appcompat:appcompat:1.1.0'
    

    【讨论】:

      猜你喜欢
      • 2020-12-04
      • 1970-01-01
      • 2019-10-19
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多