Edit: I'm terrible at explaining these things so here is a video http://sendvid.com/mefqxd8f
Context: The application consists of a single Activity with a ViewPager that holds 3 tabs. Tab1 uses an interface called PageFragmentListener to switch between 2 different fragments in the same Tab when a button is pressed. When the app first loads, Fragment1 is inflated in Tab1. After clicking the button, Fragment2 is inflated in Tab1. I'd like Fragment1 to remain in Tab1 permanently after this.
The issue: If Tab3 is currently active (visible to the user) and then the device is rotated Tab1 is completely destroyed. When it is recreated, it inflates Tab1 with Fragment1 instead of restoring Fragment2. In the video you'll see that Tab1 is blue instead of purple.
Question:
Is there a way to restore Fragment2 to Tab1 after it is destroyed rather than inflating Fragment1? I'm assuming savedInstanceState
can be used somehow.
class MyAdapter extends FragmentStatePagerAdapter {
static final String TAG = "MyAdapter";
private final FragmentManager mFragmentManager;
public BaseFragment mFragmentA;
public BaseFragment mFragmentB;
/**
* PageFragmentListener for switching fragmentA.
*/
public PageFragmentListener mListenerA = new PageFragmentListener() {
@Override
public void onSwitchToNextFragment(final String id) {
mFragmentManager.beginTransaction().remove(mFragmentA).commit();
if (mFragmentA instanceof FragmentA)
{
mFragmentA = FragmentA2.newInstance(mListenerA); // => switch fragment a2
}
else if (mFragmentA instanceof FragmentA2){
mFragmentA = FragmentA.newInstance(mListenerA);
}
notifyDataSetChanged(); // notify changes
}
};
/**
* PageFragmentListener for switching fragmentB.
*/
public PageFragmentListener mListenerB = new PageFragmentListener() {
@Override
public void onSwitchToNextFragment(final String id) {
mFragmentManager.beginTransaction().remove(mFragmentB).commit();
if (mFragmentB instanceof ItemListFragment){ // current fragment is List Fragment
Bundle arguments = new Bundle();
arguments.putString(Constants.ARG_ITEM_ID, id); // selected item id
mFragmentB = ItemOneDetailFragment.newInstance(mListenerB); // switch detail fragment
mFragmentB.setArguments(arguments);
}else if (mFragmentB instanceof ItemOneDetailFragment) { // DetailFragment
mFragmentB = ItemListFragment.newInstance(mListenerB); // => switch list fragment
}
notifyDataSetChanged(); // notify changes
}
};
public MyAdapter(FragmentManager fm) {
super(fm);
Log.d(TAG, "MyAdapterConstructor");
mFragmentManager = fm;
List<Fragment> fragments = fm.getFragments();
if(fragments != null){
for(Fragment f : fragments){
if (f instanceof FragmentA || f instanceof FragmentA2){
mFragmentA = (BaseFragment) f;
}
if(f instanceof ItemListFragment || f instanceof ItemOneDetailFragment){
mFragmentB = (BaseFragment) f;
}
}
}
}
@Override
public Fragment getItem(int position) {
Log.d(TAG, "getItem()");
if (position == 0){ // Tab-1
if (!(mFragmentA instanceof FragmentA2)) {
mFragmentA = FragmentA.newInstance(mListenerA);
}
return mFragmentA;
}
if (position == 1) // Tab-2
return FragmentB.newInstance();
if (position == 2) { // Tab-3
if (!(mFragmentB instanceof ItemOneDetailFragment)){
mFragmentB = ItemListFragment.newInstance(mListenerB);
}
return mFragmentB;
}
else{
return null;
}
}
/**
* To set tab title.
* @param position the currently visible ViewPager fragment
* @return the title of the fragment
*/
@Override
public CharSequence getPageTitle(int position) {
Log.d(TAG, "getPageTitle()");
if (position == 0) { // Tab-1
return "Tab 1";
}
if (position == 1) { // Tab-2
return "Tab 2";
}
if (position == 2) { //Tab-3
return "Tab 3";
}
return null;
}
@Override
public int getCount() { // Count of Tabs
return 3;
}
@Override
public int getItemPosition(Object object) {
Log.i("Adapter", "ItemPosition>>>" + object.toString());
if (object instanceof ItemListFragment && mFragmentB instanceof ItemOneDetailFragment) { // fragment changed
return POSITION_NONE;
}
if (object instanceof ItemOneDetailFragment && mFragmentB instanceof ItemListFragment) { // fragment changed
return POSITION_NONE;
}
if (object instanceof FragmentA && mFragmentA instanceof FragmentA2) {
return POSITION_NONE;
}
if (object instanceof FragmentA2 && mFragmentA instanceof FragmentA){
return POSITION_NONE;
}
return POSITION_UNCHANGED;
}
}