Search code examples
androidandroid-fragmentsandroid-tabhostandroid-tabs

FragmentTabHost: The specified child already has a parent


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?


Solution

  • 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);