На самом деле это несколько вопросов, касающихся использования FragmentTabHost. Я нашел рабочий образец, который использует FragmentTabHost в Activity. Мне нужно использовать его во фрагменте.
Он отображает фрагмент с вкладками, но фрагмент содержимого для вкладки не отображается. Я видел в журнале, что onCreateView() фрагмента содержимого действительно вызывается, но просто не отображается на экране.
Я видел, как кто-то использует дополнительный FrameLayout, я не уверен, почему. Но пробовал и так, и так, не помогает. а в документе он создает FragmentTabHost вместо выхода из макета. Так как же правильно использовать FragmentTabHost?
mTabHost = new FragmentTabHost(getActivity()); mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.fragment1);
Я попытался так же определить макет фрагмента вкладки (tab_fragment_layout.xml), как в примере:
<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom"/> <!-- why need it? --> <!-- with or without this @android:id/tabcontent FramLayout dosent work--> <!--FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="0" /--> <!-- --> <FrameLayout android:id="@+id/tabFrameLayout" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" /> </LinearLayout>
The TabFragment::onCreateView() is:
TabFragment extends Fragment...
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_fragment_layout, container, false);
mTabHost = (FragmentTabHost) view.findViewById(R.id.tabhost);
mTabHost.setup(getActivity(), getChildFragmentManager(),
R.id.tabFrameLayout);
mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"),
ContentFragment.class, null);
mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("Contacts"),
ContentFragment.class, null);
return view;
}
Фрагмент содержимого прост:
public class ContentFragment extends Fragment {
private String title = "no page data";
private int page = -1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
page = getArguments().getInt("someInt", 0);
title = getArguments().getString("someTitle");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_layout, container, false);
TextView tv = (TextView) v.findViewById(R.id.text);
tv.setText(this.getTag() + " Content"+", page data:"+title+" "+page);
return v;
}
}
Опять же, это просто перенос sample (используя его в действии), чтобы использовать его во фрагменте. Но после добавления этого фрагмента в действие он показывает только вкладку без фрагмента содержимого для каждой вкладки.
FragmentManager fm = getSupportFragmentManager();
TabFragment tabFrgmt = new TabFragment();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.tab_fragment_holder, tabFrgmt);
ft.addToBackStack("theTabFragment");
ft.show(tabFrgmt);
ft.commit();