Fragments Not Working Correctly After Orientation Change

android, android-fragments

Solution

Short fix:

In the `onTabSelected` method, before using `if (mFragment == null)` you need to try to get the fragment (using `mFragment = getSupportFragmentManager().findFragmentByTag(mTag)`). You can also set this from the outside but I don't see you doing this.

Checking `if(savedInstanceState == null)` on `onCreate` could also solve this and I consider it a better approach though! :)

Problem

I am having a problem with `Fragments` and orientation change. I have an application which has a `MainActivity` which handles the switching up `Fragments` via a tabbed action bar. Here is the code for the tabbed action bar and when a tab is selected. ``` private class MyTabListener <T extends android.support.v4.app.Fragment> implements ActionBar.TabListener { private android.support.v4.app.Fragment mFragment; private final Activity mActivity; private final String mTag; private final Class<T> mClass; public MyTabListener(SherlockFragmentActivity activity, String tag, Class<T> clz) { mActivity = activity; mTag = tag; mClass = clz; } @Override public void onTabSelected(Tab tab, android.support.v4.app.FragmentTransaction ft) { if (mFragment == null){ // check to see if the fragment has already been initialised. If not create a new one. mFragment = android.support.v4.app.Fragment.instantiate(mActivity, mClass.getName()); ft.add(android.R.id.content,mFragment,mTag); } else { ft.attach(mFragment); // if the fragment has been initialised attach it to the current activity } } @Override public void onTabUnselected(Tab tab, android.support.v4.app.FragmentTransaction ft) { if (mFragment != null){ ft.detach(mFragment); // when a fragment is no longer needed, detach it from the activity but dont destroy it } } @Override public void onTabReselected(Tab tab, android.support.v4.app.FragmentTransaction ft) { } ``` The way I see it is that everything works fine when the application first loads in portrait mode. When I rotate, for some reason another instance of `Fragment1` is added and then isn't detached when another tab is selected. This is also the case when I then rotate back to portrait. I have tried using `setRetainInstance(true);` in my `Fragments` but this doesn't work. Is there a method I need to override or do something with my `Fragments` before rotating? Thanks in advance. EDIT I have now seen that onTabSelected is called again when the activity is recreated. Could this be the cause of my problem with fragments being attached more than once? Here is my activities onCreate method. ``` super.onCreate(savedInstanceState); if (savedInstanceState == null) { //setContentView(R.layout.main); } // Create the Action Bar with tabs ActionBar actionBar = getSupportActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); actionBar.setDisplayShowTitleEnabled(false); //create the tab for track and add it to the action bar. Tab tab = actionBar.newTab() .setText("Track") .setTabListener(new MyTabListener<TrackingFragment>(this,"track",TrackingFragment.class)); actionBar.addTab(tab); //create the tab for ski tracks and add it to the action bar. tab = actionBar.newTab() .setText("Something Tracks") .setTabListener(new MyTabListener<TrackListFragment>(this,"somethingtracks",TrackListFragment.class)); actionBar.addTab(tab); //create the tab for photos and add it to the action bar. tab = actionBar.newTab() .setText("Photos") .setTabListener(new MyTabListener<PhotoFragment>(this,"photos",PhotoFragment.class)); actionBar.addTab(tab); ```

Original source