java - 使用选项卡主机解析 fragment 时出错

标签 java android eclipse

我正在使用以下代码从互联网获取数据并打开它。它工作得很好,但如果我更改选项卡并返回到旧选项卡,则会出错。例如,如果一开始我是选项卡 1,然后转到选项卡 2 效果很好,但如果我回到选项卡 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)

最佳答案

问题是您不能在另一个 fragment 中创建一个 fragment 。这会导致错误。幸运的是,随着最新的更新,这现在成为可能并被允许。 您可以在 Android 文档中找到有关如何执行此操作的更多信息。考虑使用 Android 支持库。

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

关于java - 使用选项卡主机解析 fragment 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14811833/

相关文章:

java - 输入数字进入下一行,但输入非数字时出现异常

android - 关闭应用程序后,广播接收器无法在 Oppo、Mi 和其他一些手机中工作

java - getResources() 返回仅包含 1 个对象的枚举

java - 使用 SAS 从 Java 批量插入 Azure 表失败

java - 程序化 View 错误,不确定我做错了什么。必须调用removeView() 子级已经有父级

Android JavaScript 自动完成表单 WebView

java - 收到 "no suitable driver found for..."JDBC 错误,但我已经将 jar 添加到我的 Eclipse 路径中

eclipse 中的 javacpp 不起作用——ClassNotFoundException(使用 JNI)

java - 是否可以在 Eclipse 中设置项目范围的 VM 参数

java - 在执行文件操作时在 java 应用程序中打开太多文件描述符