2013-02-11 56 views
2

我正在使用以下代碼從互聯網獲取數據並將其打開。它工作得很好,但如果我更改選項卡並返回到舊選項卡,則會出現錯誤。例如,如果在開始時我是標籤1,然後去TAB2的作品不錯,但如果我回去選項卡1提示錯誤使用標籤主機解析片段時出錯

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); 
    } 
} 

誤差

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) 

回答

0

的問題是,你不能在另一箇中創建一個片段。這會導致錯誤。幸運的是,最新的更新現在可能和允許的。 您可以在Android文檔中找到有關如何執行此操作的更多信息。考慮使用Android支持庫。

http://developer.android.com/about/versions/jelly-bean.html#42-ui-tools

+0

我讀到已經但是我還沒有想出如何使用新的支持,我想我已經在最新版本.. – 2013-02-11 12:42:22