backcross backcross - 2 months ago 21
Android Question

How to add tab inside fragment in android?

I try to add tab inside fragment .I can add but the content of particular tab overlap the tab

MainFragmentActivity.java

public class MainActivity extends FragmentActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fragment= new FragmentTab();
getSupportFragmentManager().beginTransaction().add(R.id.content_frame,fragment).commit();
}

}


activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>


FragmentTab.java

public class FragmentTab extends Fragment {
public FragmentTab() {

}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

}

FragmentTabHost mTabHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
// TODO Auto-generated method stub
View rootView = inflater.inflate(R.layout.fragment_tabs, container, false);

mTabHost = (FragmentTabHost) rootView.findViewById(android.R.id.tabhost);
mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);
mTabHost.addTab(mTabHost.newTabSpec("fragmentb").setIndicator("Fragment A"),
FragmentA.class, null);
mTabHost.addTab(mTabHost.newTabSpec("fragmentc").setIndicator("Fragment B" ),
FragmentB.class, null);

return rootView;
}

}


fragment_tabs.xml


<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<FrameLayout
android:id="@+id/realtabcontent"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>

</android.support.v4.app.FragmentTabHost>


FragmentA.java

public class FragmentB extends Fragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
View rootView= inflater.inflate(R.layout.fragment_a, container,false);
return rootView;
}
}


fragment_a.xml



<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="FragmentA" />

</LinearLayout>


FragmentB.java

public class FragmentB extends Fragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState) {
View rootView= inflater.inflate(R.layout.fragment_b, container,false);
return rootView;
}
}


fragment_b.xml



<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="FragmentB" />

</LinearLayout>


Screenshot :

enter image description here

Any help of suggestion would be helpful, I want the content of tab fragment below tab header.
The content of fragment overlap the tab header.I use FragmentTabHost to use tab layout in fragmentstrong text
Please help me how to solve this issue.I want the content of tab fragment below tab header.

Answer

I believe this could work for you, if you are targeting API17 +. If not you should take a look at ViewContainers, and swipeable views.

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class TabHostParentFragment extends Fragment {

private FragmentTabHost tabHost;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
tabHost = new FragmentTabHost(getActivity());
tabHost.setup(getActivity(), getChildFragmentManager(), R.layout.my_parent_fragment);

Bundle arg1 = new Bundle();
arg1.putInt("Arg for Frag1", 1);
tabHost.addTab(tabHost.newTabSpec("Tab1").setIndicator("Frag Tab1"),
    NewsFragment.class, arg1);

Bundle arg2 = new Bundle();
arg2.putInt("Arg for Frag2", 2);
tabHost.addTab(tabHost.newTabSpec("Tab2").setIndicator("Frag Tab2"),
    MyNestedFragment2.class, arg2);

return tabHost;
}