1
votes

I have an Activity with NavigationDrawer, so I have few Fragments:

public class MainActivity extends FragmentActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTitle = mDrawerTitle = getTitle();
        mDrawerMenu = (ListView) findViewById(R.id.drawer_menu);

        mProfileFragment = new ProfileFragment();
        mMainPageFragment = new MainPageFragment();
        mTestPageFragment = new TestPageFragment();
        mSettingsPageFragment = new SettingsPageFragment();
        mOnlineNeededFragment = new OnlineNeededFragment();
        mRegistrationFragment = new RegistrationFragment();
        mAuthorizationPageFragment = new AuthorizationFragment();

        //Adding fragments to NavigationDrawer

    }

    //selecting Fragment from NavigationDrawer
    private void selectItem(int position) {
        Fragment fragment = mDrawerMenuItems.get(position).getPage();

        // Insert the fragment by replacing any existing fragment
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.content_frame, fragment)
                .commit();

        //...
    }

    //...
}

Each Fragment has its private variables, which I save with

public class MainPageFragment extends Fragment {

    private int var1;
    private Date var2;
    private Date var3;

    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (savedInstanceState != null) {
            var1 = savedInstanceState.getInt("var1");
            var2 = (Date) savedInstanceState.getSerializable("var2");
            var3 = (Date) savedInstanceState.getSerializable("var3");
        }

        //...
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt("var1", var1);
        outState.putSerializable("var2", var2);
        outState.putSerializable("var3", var3);
    }
}

and restore in "onCreateView". But all time I rotate screen Activity recreates all Fragments, so I lose my old state in all Fragments.

I found the "getSupportFragmentManager().putFragment(outState, TAG, Fragment)". This function can save instance of Fragment to the Bundle and restore it later with "getSupportFragmentManager().getFragment(savedInstanceState, TAG)", so Activity don't recreate this Fragment and don't lose private variables.

But FragmentManager can save only one Fragment, which is in this FragmentManager. When I try to put all Fragments in Bundle, I get exception: "Fragment ProfileFragment{41a27730} is not currently in the FragmentManager".

How can I save all my Fragments in Bundle to restore them after rotating screen?

1

1 Answers

1
votes

Your problem lies that the onCreate method always creates a new Fragment

    mProfileFragment = new ProfileFragment();
    mMainPageFragment = new MainPageFragment();
    mTestPageFragment = new TestPageFragment();
    mSettingsPageFragment = new SettingsPageFragment();
    mOnlineNeededFragment = new OnlineNeededFragment();
    mRegistrationFragment = new RegistrationFragment();
    mAuthorizationPageFragment = new AuthorizationFragment();

put an if statement to check if it is null.

if (savedInstanceState == null) {
    mProfileFragment = new ProfileFragment();
    mMainPageFragment = new MainPageFragment();
    mTestPageFragment = new TestPageFragment();
    mSettingsPageFragment = new SettingsPageFragment();
    mOnlineNeededFragment = new OnlineNeededFragment();
    mRegistrationFragment = new RegistrationFragment();
    mAuthorizationPageFragment = new AuthorizationFragment();