How to prevent FragmentManager from being destroyed after rotation

Rekijan Kileren

When I click the show more button a new fragment opens. However if I rotate the device and then click it I get an error.

enter image description here

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)

So the code is in a RecyclerViewAdapter

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

And then in 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);
        }
    }

More code can be found in github becuase open source yay https://github.com/ej-krielen/pf2initiativetracker

A common given 'solution' is to use isDestroyed or isFinishing. Sure the app doesn't crash if I use that but then the fragment is also not being made.

So to reiterate:

  • Fragment goes fine initially but not after rotation.
  • FragmentManager has been destroyed? How to get it back/properly use it?
Rekijan Kileren

Right sometimes when updating an old project you forget your own logic. The problem was that in my adapter I use a reference to context. The adapter however is created in the AppExtension so on a recreate of the Activity this wasn't being set again. So now when the Activity gets recreated I pass the context to the adapter again and it all works fine.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

How to prevent a background process from being stopped after closing SSH client in Linux

how to prevent jsp tags from being reused after being classloaded

Angular - How to remove <style> element from <head> after the component is destroyed

How to prevent ngInfiniteScroll from being triggered multiple times after the initial trigger?

How to prevent the Content of a UserControl from being overridden?

How to prevent Service from getting destroyed

Components are not being destroyed after closing a mat-tab when building a mat-tab-group from an array

Back Stack is not maintained - How to prevent fragment from being destroyed?

How to prevent regex characters from being changed after page is rendered?

How to prevent char from being entered into JTextField after dispatching event?

How to prevent user from being unauthenticated after dynamic password change

How To Prevent Keyboard Being Closed After setState?

How do I prevent Dropbox from being automatically added to the autostart list after launching it?

Prevent UITableView rows from being destroyed

How to prevent Intent reset after device rotation?

How to prevent fields from being dropped after an EDMX update

In Eclipse RCP, how to prevent a PartStack from being destroyed when it becomes empty

How to prevent an MDI document from being minimized

How can I stop my fragment from being destroyed?

How can I elegantly prevent QThread from being destroyed or garbage collected?

How can I "save" a value from a variable after the Activity is destroyed?

How can I prevent ViewControllers from being deallocated after I inject them with a dependency in application:DidFinishLaunchingWithOptions:

React: How to prevent a setInterval from being delayed after a button is clicked to start it?

How do I prevent resources from being destroyed during the Azure DevOps Terraform Plan Step?

How to fix Rectangle to it's position to prevent it from randomly flying around the screen after rotation of device?

How to avoid text being upside down after rotation with Matplotlib?

Does anonymous functions prevent variables from being destroyed by the garbage collector?

How to prevent unique files in an s3 bucket from being overwritten after a sync?

How do I preserve a string and prevent it from being destroyed when passing it to an action script block?