Barry Fruitman
Barry Fruitman

Reputation: 12666

Restoring Fragment state after configuration change if Activity layout changes

My Activity has a one-pane layout in portrait and a two-pane layout in landscape, using Fragments. I'd like the system to restore all the views after an orientation change, but I don't know where to start.

Is this even possible considering the layout is different (but similar) in the two orientations?

If anyone has implemented this (or at least tried), please share you experience.

Upvotes: 2

Views: 6215

Answers (3)

IgorGanapolsky
IgorGanapolsky

Reputation: 26831

I urge you to use a Fragment with setRetainInstance(true) in its onCreate method. This makes the fragment retain its member variables across Activity configuration changes. Please read this blog post which explains the information you need: http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

Upvotes: 2

rmlin
rmlin

Reputation: 29

Maybe I know what the problem is. Hope my answer helps someone want to solve such problem. In case there are a Fragment in your Activity, you config that Activity in AndroidManifest.xml with

android:configChanges="keyboardHidden|orientation|screenSize"

then, you want to change the layout of the Activity when onConfigurationChanged triggered. Once the Activity inflate a new layout or using setContentView(R.layout.new_layout);, the fragment will disappear, however, that fragment still running and just disappear from the view.

So the problem is that fragment is attached to the previous layout, what you need to do:

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
if (fm.findFragmentById(R.id.pane_list) == null) {
    // instantiate fragment and add to view
    mFragment = new ItemFragment();
    transaction.add(R.id.pane_list, mFragment );
} else {
    // fragment already exists, we re-attahced it
    mFragment = fm.findFragmentById(R.id.pane_list);
    transaction.detach(mFragment);
    transaction.attach(mFragment);
}
transaction.commit();

After detached from old layout and attached to new layout, problem solved. Correct me if there any wrong :)

Upvotes: 2

Eugene
Eugene

Reputation: 60224

@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("curChoice", mCurCheckPosition);
    }

Which you can use later like this:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null) {
            // Restore last state for checked position.
            mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
        }
}

Upvotes: 1

Related Questions