FragmentTabHost的简单用法

经常使用RadioButton+ViewPager或RadioButton+事务的方式来切换Fragment的显示。于是换一种方式采用FragmentTabHost来进行实现,与RadioButton+ViewPager比较起来,代码会多一些但是省去了联动的设置。FragmentTabHost内部是使用事务来进行Fragment的切换的。
使用步骤:
1)写界面的布局文件
FragmentTabHost的简单用法_第1张图片

FrameLayout里面用来放Fragment,而FragmentTabHost里面放点击切换Fragment的选项卡(即Tab)。这里需要注意的是,网上有一些文章强调在为FrameLayout和FragmentTabHost指定ID的时候需要指定@android:id系统指定ID,其实不用,使用普通的ID即可。

2)准备好Fragment和Fragment所使用的布局文件
FragmentTabHost的简单用法_第2张图片

FragmentTabHost的简单用法_第3张图片

3)准备好选项卡的布局文件
FragmentTabHost的简单用法_第4张图片

这3个选项类似,可以看其中一个:
FragmentTabHost的简单用法_第5张图片
预览效果:
FragmentTabHost的简单用法_第6张图片

注意:FragmentTabHost允许使用文字,文字+图标和View作为选项卡。创建布局文件,将布局文件膨胀为View后将其作为作为选项卡。点击选项卡就可以切换第1步中FrameLayout内显示的Fragment了。需要特别注意的是,不能使用Button作为选项卡中被点击的内容。
另外如果使用selector作为选项卡的背景和前景效果时,被点选的选项卡selected为true。
FragmentTabHost的简单用法_第7张图片

FragmentTabHost的简单用法_第8张图片

4)布局相关工作结束,进入编码阶段
4.1)根据id获取FragmentTabHost对象:

 tabHost = (FragmentTabHost) findViewById(R.id.tabhost);
 initTabHost();

4.2) 设置的内容包括:Fragment显示在哪里,选项卡的标识和样子(文字,文字+图片,或View),选项卡与Fragment的对应关系,其它设置

private void initTabHost() {
        //要切换显示的所有Fragment
        List list = new ArrayList();
        list.add(CarControlFragment.class);
        list.add(CarStateFragment.class);
        list.add(CarAccountFragment.class);
        //选项卡的标识
        List tags = Arrays.asList(
                            "控制", "状态", "账户");
        //选项卡使用View,layouts是这些3个选项卡样式各自的布局文件
        List 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);

最终运行效果为:
FragmentTabHost的简单用法_第9张图片

你可能感兴趣的:(FragmentTabHost的简单用法)