之前的项目使用的底部tab导航都是RadioGroup,最近看到一个Demo里用的是FragmentTabHost,貌似代码更简洁,逻辑更简单。遂拿来试试,希望好奇心不要害死猫。
布局文件里引入控件,v4包下提供支持。
<android.support.v4.app.FragmentTabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
其上部放置一个FrameLayout作为fragment的容器。
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1.0"
android:background="@color/background_color" />
Activity的onCreate方法中初始化,并指定tab数量、tab的图标、名称和对应的fragment
Indicator[] indicators = Indicator.values();
mFragmentTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
mFragmentTabHost.setup(getApplicationContext(), fragmentManager, R.id.fragment_container);
//初始化Tab
for (int i = 0; i < indicators.length; i++){
TabHost.TabSpec tabSpec = mFragmentTabHost.newTabSpec(getString(indicators[i].getResName()));
tabSpec.setIndicator(getIndicatorView(indicators[i]));
mFragmentTabHost.addTab(tabSpec, indicators[i].getClz(), null);
}
Indicator是什么鬼?是对Tab的内容的封装
public enum Indicator {
FIRST(0, R.string.tab_name1, R.drawable.tab_icon_review,
FirstFragment.class),
SECOND(1, R.string.tab_name2, R.drawable.tab_icon_test,
SecondFragment.class),
THIRD(2, R.string.tab_name3, R.drawable.tab_icon_other,
ThirdFragment.class);
private int idx;
private int resName;
private int resIcon;
private Class<?> clz;
private Indicator(int idx, int resName, int resIcon, Class<?> clz) {
this.idx = idx;
this.resName = resName;
this.resIcon = resIcon;
this.clz = clz;
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public int getResName() {
return resName;
}
public void setResName(int resName) {
this.resName = resName;
}
public int getResIcon() {
return resIcon;
}
public void setResIcon(int resIcon) {
this.resIcon = resIcon;
}
public Class<?> getClz() {
return clz;
}
public void setClz(Class<?> clz) {
this.clz = clz;
}
}
那么问题来了?为什么要使用FragmentTabHost呢?
首先FragmentTabHost是谷歌官方出品,专门用来做tab的,再者,它继承自ViewGroup,我们如果想要加一个消息提示的红色数字,不需要在Layout文件里添加外层布局,可以直接指定layoutParams添加到目标位置。