【问题标题】:How to prevent FragmentManager from being destroyed after rotation如何防止 FragmentManager 在旋转后被销毁
【发布时间】:2021-12-24 10:03:10
【问题描述】:

当我单击显示更多按钮时,会打开一个新片段。但是,如果我旋转设备然后单击它,则会出现错误。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.rekijan.initiativetrackersecondedition, PID: 4673
    java.lang.IllegalStateException: FragmentManager has been destroyed
        at androidx.fragment.app.FragmentManager.enqueueAction(FragmentManager.java:1878)
        at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:329)
        at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:294)
        at com.rekijan.initiativetrackersecondedition.ui.activities.MainActivity.replaceCharacterDetailFragment(MainActivity.java:207)
        at com.rekijan.initiativetrackersecondedition.character.adapter.CharacterAdapter$2.onClick(CharacterAdapter.java:305)
        at android.view.View.performClick(View.java:7448)
        at android.view.View.performClickInternal(View.java:7425)
        at android.view.View.access$3600(View.java:810)
        at android.view.View$PerformClick.run(View.java:28305)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

所以代码在 RecyclerViewAdapter 中

holder.showCharacterDetailButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ((MainActivity)context).replaceCharacterDetailFragment(holder.getAdapterPosition());
            }
        });

然后在MainActivity中

public void replaceCharacterDetailFragment(int position) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (getResources().getBoolean(R.bool.isTablet)) {
            transaction.replace(R.id.second_fragment_container, CharacterDetailFragment.newInstance(position));
            transaction.commit();
        } else {
            transaction.replace(R.id.main_fragment_container, CharacterDetailFragment.newInstance(position));
            transaction.addToBackStack(null);
            transaction.commit();
            //Enable the back button in action bar
            if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            AppExtension app = (AppExtension) this.getApplicationContext();
            app.setShowBackNavigation(true);
        }
    }

更多代码可以在 github 中找到,因为开源 yay https://github.com/ej-krielen/pf2initiativetracker

一个常见的“解决方案”是使用 isDestroyed 或 isFinishing。当然,如果我使用它,应用程序不会崩溃,但片段也不会被制作。

所以重申一下:

  • 片段最初可以正常运行,但旋转后就不行了。
  • FragmentManager 已被销毁?如何取回/正确使用它?

【问题讨论】:

    标签: android fragmentmanager


    【解决方案1】:

    有时在更新旧项目时,您会忘记自己的逻辑。问题是在我的适配器中我使用了对上下文的引用。然而,适配器是在 AppExtension 中创建的,因此重新创建了没有再次设置的 Activity。所以现在当 Activity 重新创建时,我再次将上下文传递给适配器,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-23
      • 2021-01-07
      • 2015-05-16
      • 2018-01-22
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 2015-01-07
      相关资源
      最近更新 更多