How to restore ViewPager from savedInstanceState

So, I have a problem that I cannot solve. I have a ViewPager in one of my actions, say MainActivity. I implement all the necessary methods for saving and retrieving instance state when activity is deleted in the background. But when the action tries to restore its state, the fragments are restored, but they are not tied to the viewpager, so all I get is a white screen.

Here is the recipe code:

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //..
    if (savedInstanceState==null) {
        setupViewPager();
    }
}

private void setupViewPager() {
    mAdapter = new ViewPagerAdapter(getSupportFragmentManager());
    mAdapter.addFrag(FirstFragment.newInstance(mFeedItem), "INFO");
    //Note: mFeedItem is obtained from the intent and I have verified
    //      that it is properly restored.
    mAdapter.addFrag(SecondFragment.newInstance(mFeedItem), "SERVICES");
    mViewPager.setAdapter(mAdapter);
    mTabLayout.setupWithViewPager(mViewPager);
}

ViewPagerAdapter.java

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

FirstFragment.java

public static FirstFragment newInstance(Workshop item) {
    FirstFragment f = new FirstFragment();
    f.mItem = item;
    return f;
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("feed_item",Workshop.packToGson(mItem));
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_item_detail_info, container, false);
    if (savedInstanceState!=null) {
        mItem = Workshop.extractGson(savedInstanceState.getString("feed_item"));
    }
    return v;
}

So, if I move on to another action and then MainActivityget killed in the background (I use the Dont Keep Activities parameter check this), this happens:

1) , .
2) onCreateView , savedInstanceState .
3) ViewPager Adapter null. , , /viewpager.

? -, ?

PS:

, MainActivity:

if (savedInstanceState==null) {
    setupViewPager();
}

setupViewPager();, , . . , , , , , . , .

+6
2

Activity, . ViewPager Adapter. .

  • FragmentStatePagerAdapter / Fragments FragmentManager
  • Fragments Fragment

- , Fragment. , ID. grepcode FragmentPagerAdapter ( StateAdapter)

private static String makeFragmentName(int viewId, int index) {
    return "android:switcher:" + viewId + ":" + index;
}

Fragment setupViewPager - FragmentManager , ,

mAdapter = new ViewPagerAdapter(getSupportFragmentManager());
int fragmentCount = 2; // save value if it a arbitrary list of fragments
for (int index = 0; i < fragmentCount; i++) {
    FirstFragment firstFragment = (FirstFragment) getSupportFragmentManager().findFragmentByTag(makeFragmentName(R.id.view_pager, index));
    if (firstFragment == null) {
        firstFragment = FirstFragment.newInstance(mFeedItem);
    }
    mAdapter.addFrag(firstFragment, "someTitle");
}

Fragments FragmentManager. , , BaseFragments .. , Fragment , .


-, Fragment Fragment. Fragment . . , , ?

+2

FragmentStatePagerAdapter saveState() restoreState() .

https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html#saveState()

saveState: , , , , .

, . , , .

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        setupViewPager(savedInstanceState);
    }
}

private void setupViewPager(Bundle savedInstanceState) {
    mAdapter = new ViewPagerAdapter(getSupportFragmentManager());

    if (savedInstanceState != null) {
        Parcelable parcelable = savedInstanceState.getParcelable("Adapter");
        mAdapter.restoreState(parcelable, getClassLoader());
    } else {
        mAdapter.addFrag(FirstFragment.newInstance(mFeedItem), "INFO");
        //Note: mFeedItem is obtained from the intent and I have verified
        //      that it is properly restored.
        mAdapter.addFrag(SecondFragment.newInstance(mFeedItem), "SERVICES");
    }
    mViewPager.setAdapter(mAdapter);
    mTabLayout.setupWithViewPager(mViewPager);
}

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

    Parcelable parcelable = mAdapter.saveState();
    outState.putParcelable("Adapter", parcelable);
}
+1

All Articles