首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FragmentManager已被销毁

FragmentManager已被销毁
EN

Stack Overflow用户
提问于 2019-11-12 16:29:26
回答 3查看 5.4K关注 0票数 7

编辑:似乎只有当我之前的活动是横向的,而setRequestedOrientation()是纵向的时,才会发生这种情况,这会是什么问题呢?

我在一个活动中有一段代码,它向REST API发起一个截击请求来检索一些数据,并有一个回调函数,如果成功检索到数据,它将启动一个片段。然而,这只适用于纵向模式,在横向模式下,它将抛出异常“片段管理器已被销毁”。

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

这是此活动的onCreate()方法:

代码语言:javascript
复制
@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()方法:

代码语言:javascript
复制
  private void loadFirstPage() {
        VMSSettingsPageOneFragment fragment = new VMSSettingsPageOneFragment();
        FragmentManager fm = getSupportFragmentManager();

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

错误消息:

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2020-03-24 23:57:10

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

代码语言:javascript
复制
 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;
    }
票数 6
EN

Stack Overflow用户

发布于 2021-09-03 11:49:50

也许可以在代码中使用parentFragmentManager.beginTransaction()而不是childFragmentManager,如下所示

代码语言:javascript
复制
dialog.show(parentFragmentManager.beginTransaction(), BaseFragment.TAG_DIALOG)
票数 1
EN

Stack Overflow用户

发布于 2020-02-05 16:51:41

您好,您可以这样使用它

声明一个处理程序

代码语言:javascript
复制
Handler handler = new Handler()

然后将commit放入处理程序的post delayed中

代码语言:javascript
复制
// 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)

不会把其他东西放在延迟发布的ie中。向事务添加分片(或替换transaction.replace( fragment,containerid,tag))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58814735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档