【问题标题】:android: tabhost in a fragment, w/ fragments as tabsandroid:片段中的tabhost,带有片段作为选项卡
【发布时间】:2012-05-25 21:53:25
【问题描述】:

我试图拥有一个包含在片段中的标签主机,其中标签内容由片段定义。那好吧,

我从 google 的 FragmentsTab 示例开始。这显示了如何使用片段作为选项卡内容,但 TabHost 本身仍托管在活动中。同样,我需要将选项卡主机托管在片段中。

我以FragmentsTab 为例,将onCreate() 中的代码移动到我的Fragment 中的onCreateView()

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View fragmentView = inflater.inflate(R.layout.detail_fragment, container);

    mTabHost = (TabHost) fragmentView.findViewById(android.R.id.tabhost);
    mTabHost.setup();

    mTabManager = new TabManager(getActivity(), mTabHost, R.id.realtabcontent);

    // TODO: localize
    mTabManager.addTab(mTabHost.newTabSpec("info").setIndicator("File Info"), InfoFragment.class, null);

    return fragmentView;
}

当我运行时,我得到了这个异常,

05-25 14:42:27.272: E/AndroidRuntime(4701): Caused by: java.lang.IllegalStateException: Recursive entry to executePendingTransactions
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1343)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:429)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.TabManager.onTabChanged(TabManager.java:116)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:359)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.setCurrentTab(TabHost.java:344)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.addTab(TabHost.java:216)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.TabManager.addTab(TabManager.java:92)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.DetailFragment.onCreateView(DetailFragment.java:46)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:819)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1053)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1371)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:429)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.TabManager.onTabChanged(TabManager.java:116)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.invokeOnTabChangeListener(TabHost.java:359)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.setCurrentTab(TabHost.java:344)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.widget.TabHost.addTab(TabHost.java:216)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.TabManager.addTab(TabManager.java:92)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at com.zimbra.octopus.android.DetailFragment.onCreateView(DetailFragment.java:46)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:819)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1032)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1111)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:264)
05-25 14:42:27.272: E/AndroidRuntime(4701):     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:563)

查看跟踪,我看到onCreateView() 递归调用DetailFragment(承载TabHost 的片段)。不知何故,对TabManager.addTab() 的调用(再次参见 FragmentsTab 示例)导致对DetailFragment.onCreateView() 的递归调用。

我做错了什么?这甚至可能吗?

【问题讨论】:

  • 你不是想在另一个片段中嵌入一个片段,是吗?
  • 是的,我是。我想你会告诉我这是我的问题,对吗?
  • 是的,框架不允许你这样做...抱歉-_-
  • 来自文档:“片段必须始终嵌入到活动中,并且片段的生命周期直接受到宿主活动生命周期的影响。”

标签: android android-fragments android-tabhost


【解决方案1】:

Android 不允许您将一个片段嵌入到其他片段中。您的 logcat 表明您正在另一个片段事务中执行一个片段事务(即递归条目到 executePendingTransactions)。只是不允许,对不起!

【讨论】:

【解决方案2】:

在设置 TabHost 之前添加:

LocalActivityManager mLocalActivityManager = new LocalActivityManager(getActivity(), false);
mLocalActivityManager.dispatchCreate(savedInstanceState);
mTabHost.setup(mLocalActivityManager);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多