I am using following code to get data from internet and open it. It works pretty fine but gives error if i change the tab and go back to old tab. E.g if at start i am tab 1 and then go to tab2 works good but if i go back to tab 1 it gives error
public class MainMenu extends FragmentActivity
{
private TabHost tHost;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main_menu);
tHost = (TabHost) findViewById(android.R.id.tabhost);
tHost.setup();
/** Defining Tab Change Listener event. This is invoked when tab is changed */
TabHost.OnTabChangeListener tabChangeListener = new TabHost.OnTabChangeListener()
{
@Override
public void onTabChanged(String tabId)
{
FragmentManager fm = getSupportFragmentManager();
PrayerTimes prayerFragment = (PrayerTimes) fm.findFragmentByTag("prayerTimes");
CompassActivity qiblaFragment = (CompassActivity) fm.findFragmentByTag("qibla");
Settings settingFragment = (Settings) fm.findFragmentByTag("settings");
FragmentTransaction ft = fm.beginTransaction();
/** Detaches the androidfragment if exists */
if(prayerFragment!=null)
ft.detach(prayerFragment);
if(qiblaFragment!=null)
ft.detach(qiblaFragment);
if(settingFragment!=null)
ft.detach(qiblaFragment);
/** If current tab is android */
if(tabId.equals("prayerTimes"))
{
if(prayerFragment == null)
{
/** Create AndroidFragment and adding to fragmenttransaction */
ft.add(R.id.realtabcontent,new PrayerTimes(), "prayerTimes");
}
else
{
/** Bring to the front, if already exists in the fragmenttransaction */
ft.attach(prayerFragment);
}
}
else if (tabId.equals("qibla"))
{
if( qiblaFragment == null)
{
/** Create AppleFragment and adding to fragmenttransaction */
ft.add(R.id.realtabcontent,new CompassActivity(), "qibla");
}
else
{
/** Bring to the front, if already exists in the fragmenttransaction */
ft.attach(qiblaFragment);
}
}
else if(tabId.equals("settings"))
{
if( settingFragment == null)
{
/** Create AppleFragment and adding to fragmenttransaction */
ft.add(R.id.realtabcontent,new Settings(), "settings");
}
else
{
/** Bring to the front, if already exists in the fragmenttransaction */
ft.attach(settingFragment);
}
}
ft.commit();
}
};
/** Setting tabchangelistener for the tab */
tHost.setOnTabChangedListener(tabChangeListener);
/** Defining tab builder for Andriod tab */
TabHost.TabSpec tSpecPrayer = tHost.newTabSpec("prayerTimes");
tSpecPrayer.setIndicator("Prayer Times");
tSpecPrayer.setContent(new MyTabContent(getBaseContext()));
tHost.addTab(tSpecPrayer);
/** Defining tab builder for Apple tab */
TabHost.TabSpec tSpecQibla = tHost.newTabSpec("qibla");
tSpecQibla.setIndicator("Qibla");
tSpecQibla.setContent(new MyTabContent(getBaseContext()));
tHost.addTab(tSpecQibla);
TabHost.TabSpec tSpecSettings = tHost.newTabSpec("settings");
tSpecSettings.setIndicator("Settings");
tSpecSettings.setContent(new MyTabContent(getBaseContext()));
tHost.addTab(tSpecSettings);
}
}
error is
2-11 12:21:28.245: E/AndroidRuntime(992): FATAL EXCEPTION: main
02-11 12:21:28.245: E/AndroidRuntime(992): java.lang.IllegalStateException: Recursive entry to executePendingTransactions
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:523)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.view.ViewPager.setCurrentItemInternal(ViewPager.java:495)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.view.ViewPager.onRestoreInstanceState(ViewPager.java:1221)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.view.View.dispatchRestoreInstanceState(View.java:12088)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2582)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2588)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.view.View.restoreHierarchyState(View.java:12066)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.Fragment.restoreViewState(Fragment.java:417)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:933)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.FragmentManagerImpl.attachFragment(FragmentManager.java:1264)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:672)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.os.Handler.handleCallback(Handler.java:725)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.os.Handler.dispatchMessage(Handler.java:92)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.os.Looper.loop(Looper.java:137)
02-11 12:21:28.245: E/AndroidRuntime(992): at android.app.ActivityThread.main(ActivityThread.java:5039)
02-11 12:21:28.245: E/AndroidRuntime(992): at java.lang.reflect.Method.invokeNative(Native Method)
02-11 12:21:28.245: E/AndroidRuntime(992): at java.lang.reflect.Method.invoke(Method.java:511)
02-11 12:21:28.245: E/AndroidRuntime(992): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
02-11 12:21:28.245: E/AndroidRuntime(992): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
02-11 12:21:28.245: E/AndroidRuntime(992): at dalvik.system.NativeStart.main(Native Method)
The problem is that you are not allowed to create one fragment within another one. This causes the error. Luckily, with the latest update this now is possible and allowed.
You find further information on how to do this on the Android documentation. Consider using the Android-Support library.
http://developer.android.com/about/versions/jelly-bean.html#42-ui-tools