2012-05-25 3 views
4

Как указано в заголовке, я пытаюсь создать табус, содержащий его в фрагменте, где содержимое вкладки определяется фрагментами. okay then,android: tabhost в фрагменте, w/фрагменты в виде вкладок

Я начал с примера FragmentsTab из Google. это показывает, как использовать фрагменты в качестве содержимого вкладки, но сам TabHost по-прежнему размещен в действии. снова, мне нужно, чтобы хост вкладки размещался во Фрагменте.

я взял FragmentsTab пример, и переместил код в onCreate() и перенес ее в onCreateView() в моем Fragment,

@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().

что я делаю неправильно? это даже возможно? спасибо.

+0

Вы не пытаетесь вставить фрагмент в другом фрагменте, вы? –

+0

да, я. я думаю, вы скажете мне, что это моя проблема, правильно? –

+0

Yup, фреймворк не позволяет это сделать ... извините за это -_- –

ответ

2

Android не позволяет вставлять одни фрагменты внутри других фрагментов. Ваш логарифм указывает, что вы выполняете одну транзакцию фрагмента в другой (т. Е. Рекурсивную запись для выполненияPendingTransactions). Это просто нельзя, извините!

+5

Вложенные фрагменты теперь поддерживаются. http://developer.android.com/about/versions/jelly-bean.html#42-ui-tools Это должно позволить вкладке Fragment внутри узла вкладки Fragment, правильно? – ariets

+0

Yay! :) :) :) :) :) –

0

добавить это, прежде чем настройки вашего TabHost:

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