【问题标题】:FragmentManager has been destroyedFragmentManager 已被销毁
【发布时间】:2019-11-12 08:29:25
【问题描述】:

编辑:这似乎只有在我之前的活动是横向的并且 setRequestedOrientation() 是纵向的情况下才会发生,这可能是什么问题?

我在一个活动中有一个代码,它启动一个对 REST API 的 Volley 请求以检索一些数据,并有一个回调,如果数据被成功检索,它将启动一个片段。但是这只适用于纵向模式,在横向模式下,它会抛出“片段管理器已被销毁”的异常。

我似乎找不到这个问题的根源,因此我无法尝试任何替代解决方案。

这是我这个活动的 onCreate() 方法:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRequestedOrientation(SettingsManager.getOrientationSettings(this));
        setContentView(R.layout.activity_settings);

        findViews();
        setListeners();
        getSettings();
    }

goSettings() 将检索数据,设置请求的方向将是 ActivityInfo.SCREEN_ORIENTATION_PORTRAITActivityInfo.SCREEN_ORIENTATION_USER_LANDSCAPE

我的 loadFirstPage() 方法:

  private void loadFirstPage() {
        VMSSettingsPageOneFragment fragment = new VMSSettingsPageOneFragment();
        FragmentManager fm = getSupportFragmentManager();

        fm.beginTransaction()
                .replace(R.id.settings_fragment_container, fragment)
                .commit();
    }

错误信息:

E/FileUtils: File Write Exception
    java.lang.IllegalStateException: FragmentManager has been destroyed
        at androidx.fragment.app.FragmentManager.enqueueAction(FragmentManager.java:1853)
        at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:321)
        at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:286)
        at com.timeteccloud.icomm.platformVMS.settingsActivity.VMSSettingsActivity.loadFirstPage(VMSSettingsActivity.java:87)

【问题讨论】:

标签: android android-fragments fragmentmanager


【解决方案1】:

您可以在提交片段事务之前进行检查,如下所示。

 public boolean loadFragment(Fragment fragment) {
        //switching fragment
        if (fragment != null) {
            FragmentTransaction transaction = fm.beginTransaction();
            transaction.replace(R.id.main_frame_layout, fragment);

            if (!fm.isDestroyed())
                transaction.commit();
            return true;
        }
        return false;
    }

【讨论】:

    【解决方案2】:

    也许你可以在代码中使用parentFragmentManager.beginTransaction() 而不是childFragmentManager 看起来像

    dialog.show(parentFragmentManager.beginTransaction(), BaseFragment.TAG_DIALOG)
    

    【讨论】:

      【解决方案3】:

      你好,你可以这样使用它

      声明一个处理程序

      Handler handler = new Handler()
      

      然后将提交提交到处理程序的延迟后

      // this is a hack to fix fragment has been destroyed issue do not put Transaction.replace
              // into handler post delayed
              handler.postDelayed({
                  // transaction.addToBackStack(null)
                  transaction.commit()
              },500)
      

      不要将其他东西放在延迟的帖子中,即。将片段添加到事务(或替换 transaction.replace(fragment,containerid,tag)

      【讨论】:

        猜你喜欢
        • 2020-06-23
        • 2021-01-07
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多