经常使用RadioButton+ViewPager或RadioButton+事务的方式来切换Fragment的显示。于是换一种方式采用FragmentTabHost来进行实现,与RadioButton+ViewPager比较起来,代码会多一些但是省去了联动的设置。FragmentTabHost内部是使用事务来进行Fragment的切换的。
使用步骤:
1)写界面的布局文件
FrameLayout里面用来放Fragment,而FragmentTabHost里面放点击切换Fragment的选项卡(即Tab)。这里需要注意的是,网上有一些文章强调在为FrameLayout和FragmentTabHost指定ID的时候需要指定@android:id系统指定ID,其实不用,使用普通的ID即可。
2)准备好Fragment和Fragment所使用的布局文件
3)准备好选项卡的布局文件
这3个选项类似,可以看其中一个:
预览效果:
注意:FragmentTabHost允许使用文字,文字+图标和View作为选项卡。创建布局文件,将布局文件膨胀为View后将其作为作为选项卡。点击选项卡就可以切换第1步中FrameLayout内显示的Fragment了。需要特别注意的是,不能使用Button作为选项卡中被点击的内容。
另外如果使用selector作为选项卡的背景和前景效果时,被点选的选项卡selected为true。
4)布局相关工作结束,进入编码阶段
4.1)根据id获取FragmentTabHost对象:
tabHost = (FragmentTabHost) findViewById(R.id.tabhost);
initTabHost();
4.2) 设置的内容包括:Fragment显示在哪里,选项卡的标识和样子(文字,文字+图片,或View),选项卡与Fragment的对应关系,其它设置
private void initTabHost() {
//要切换显示的所有Fragment
List<Class> list = new ArrayList<Class>();
list.add(CarControlFragment.class);
list.add(CarStateFragment.class);
list.add(CarAccountFragment.class);
//选项卡的标识
List<String> tags = Arrays.asList(
"控制", "状态", "账户");
//选项卡使用View,layouts是这些3个选项卡样式各自的布局文件
List<Integer> layouts = Arrays.asList(
R.layout.tab_view_1,
R.layout.tab_view_2,
R.layout.tab_view_3);
//设置Fragment将在哪里显示(
//在id为tabcontent的FrameLayout中显示)
tabHost.setup(this,
getSupportFragmentManager(),
R.id.tabcontent);
for (int i = 0; i < 3; i++) {
//获得第i个选项卡的View
View view = LayoutInflater.from(this)
.inflate(layouts.get(i), null);
//创建第i个选项卡,该选项卡的标识为tags.get(i),
//该选项卡的样式为view
TabHost.TabSpec tab = tabHost.newTabSpec(
tags.get(i)).setIndicator(view);
//建立选项卡和Fragment的对应关系,
//当点击该选项卡时在FrameLayout中
//显示list中第i个Fragment
tabHost.addTab(tab, list.get(i), null);
//其它设置 选项卡之间没有分割线
tabHost.getTabWidget().setDividerDrawable(null);
}
}
默认FragmentTabHost会让第一个选项卡处于选中状态(selected==true),并在FrameLayout中显示第一个Fragment。可以通过setCurrentTab方法来指定默认选中的选项卡以及其对应的Fragment:
tabHost.setCurrentTab(idx);
最终运行效果为: