Search code examples
androidandroid-fragmentsfragmenttransactionfragmentmanager

FragmentTransaction hide() upon Activity recreation(config change/etc)


FragmentTransaction's hide() does not persist when Activity gets recreated upon config change(rotation, etc).

It re-adds all fragments in the back-stack, so the fragments previously hidden becomes visible. Ex) Fragments A(hide), B(show), C(hide), D(hide) are in back stack. When I rotate, for instance, it displays Fragment D on top after loading A, B, and C.

    FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();

    ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out, R.anim.fade_in, R.anim.fade_out);

    // Hide all fragments other than the first
    for (int i = 1; i < fragments.length; i++) {
        if (fragments[i] != null) {
            ft.hide(fragments[i]);
        }
    }

    // Display only the first fragment
    if (fragments[0].isAdded()) {
        ft.show(fragments[0]);
    }
    else {
        ft.add(R.id.content_view, fragments[0], fragmentTag);
    }

    ft.commit();

Any workaround for this?

[Edit] Adding detail for the context of the problem.

What I'm trying to accomplish is to have bottom bar(my custom view that simply tells me which tab has been tapped) that I can switch between fragments to the same state it was at.

An example is Instagram, Quora, and Google Plus apps. enter image description here

[Edit 2 in response to Scrotos]

This is in my Presenter class. loadFirstScreen() performs a fragment transaction above. Others are just initializations like setting contents and registering listeners.

public void onCreate(Bundle savedInstanceState) {
    mView.initActionbar();
    mView.initViews();
    mModel.getUserProfile().subscribe(new Subscriber<UserProfile>() {
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
        }

        @Override
        public void onNext(UserProfile userProfile) {
            mView.initDrawer(userProfile);
        }
    });

    if (savedInstanceState == null) {
        mView.loadFirstScreen();
    }
}

Solution

  • The code in the question actually worked. One thing to note is to not set the actionbar title if hidden() is true in the fragments during recreation from config changes.

    Thanks @Scrotos for chatting.