I'm trying to have a FragmentTabHost and set custom views for tabs. The FragmentTabHost is inflated inside a Fragment. This is the Fragment code:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_friends, container, false);
mTabHost = (FragmentTabHost) root.findViewById(android.R.id.tabhost);
mTabHost.setup(getActivity(), getChildFragmentManager(),android.R.id.tabcontent);
TabHost.TabSpec friends = mTabHost.newTabSpec(FriendsTabFragment.TAG);
View tab = inflater.inflate(R.layout.friends_fragment_custom_tab,null);
ImageView view = (ImageView) tab.findViewById(R.id.tab_icon);
view.setImageResource(R.drawable.categoria_amici);
friends.setIndicator(view);
mTabHost.addTab(friends, FriendsTabFragment.class, null);
return root;
}
And here's the layout:
<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_marginBottom="-4dp"/>
</LinearLayout>
</android.support.v4.app.FragmentTabHost>
This is the FriendsTabFragment inflating code:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_friends_tab, container,false);
return root;
}
This is the custom view tab (R.layout.friends_fragment_custom_tab):
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/black">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tab_icon"/>
</LinearLayout>
If I run the project with this configuration it crashes on mTabHost.addTab() method saying that the specified child already has a parent. If I remove the LinearLayout around the ImageView inside the custom view tab, it works! But I need some customizations so I need that LinearLayout there. What am I doing wrong?
Change your layout to this one:
<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:layout_marginBottom="-4dp"/>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="0" />
<FrameLayout
android:id="@+id/realtabcontent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
</android.support.v4.app.FragmentTabHost>
and also change:
mTabHost.setup(getActivity(), getChildFragmentManager(),android.R.id.tabcontent);
friends.setIndicator(view);
to
mTabHost.setup(getActivity(), getChildFragmentManager(),R.id.realtabcontent);
friends.setIndicator(tab);