FragmentTabHost + Fragment 使用小记

  由于业务需要,需要在使用Activity的顶部使用一个导航栏,点击导航栏的tab,下面显示内容。决定采用项目中已经使用过的FragmentTabHost + Fragment的方式实现。不同的是之前的FragmentTabHost位于底部(下面统称:Bottom),现在需要放置在顶部(下面统称:Top)。下面将对这两种方式进行比较:

Bottom:

  Activity布局文件:

    

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:id="@+id/activity_main"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical" >
 7
 8     <FrameLayout
 9         android:id="@+id/content_main"
10         android:layout_width="match_parent"
11         android:layout_height="0dp"
12         android:layout_weight="1"
13         android:background="@color/white"/>
14
15     <android.support.v4.app.FragmentTabHost
16         android:id="@+id/tabHost_main"
17         android:layout_width="match_parent"
18         android:layout_height="wrap_content"
19         android:layout_marginTop="5dp">
20         <FrameLayout
21             android:id="@+id/tabContent"
22             android:layout_width="match_parent"
23             android:layout_height="wrap_content"/>
24     </android.support.v4.app.FragmentTabHost>
25
26 </LinearLayout>

Activity中设置FragmentTabHost:

    protected void initTabs() {
        fm = getSupportFragmentManager();
        layoutInflater = LayoutInflater.from(this);

        tabLabels  = new String[]{
                CommonUtil.getStringFromRes(this, R.string.text_tab_promotion),
                CommonUtil.getStringFromRes(this, R.string.text_tab_order),
                CommonUtil.getStringFromRes(this, R.string.text_tab_personal)
        };

        tabHost.setup(this, fm, R.id.content_main);
        for (int i=0; i<fragments.length; i++) {
            TabHost.TabSpec tabSpec = tabHost.newTabSpec(tabLabels[i]).setIndicator(getTabItemView(i));
            tabHost.addTab(tabSpec, fragments[i], null);
            tabHost.getTabWidget().getChildAt(i).setBackgroundResource(R.color.white);
        }
        tabHost.getTabWidget().setDividerDrawable(null);
    }

显示正常


Top:

top方式Activity中对FragmentTabHost的设置跟上面一样,因此只对Layout做对比。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v4.app.FragmentTabHost
        android:id="@+id/tab_host"
        android:layout_width="match_parent"
        android:layout_height="40dp"/>

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

</LinearLayout>

结果为:

下面的内容,无论tab切换到哪一个,都是空白。针对这种情况,进行断点分析,发现Fragment中的View控件都已经被加载,只是被遮挡住了。

因此,问题应该出在布局上。

  偶然的将LinearLayout换成RelativeLayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_marginTop="42dp"
        android:id="@+id/fragment_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <android.support.v4.app.FragmentTabHost
        android:id="@+id/tab_host"
        android:layout_width="match_parent"
        android:layout_height="40dp"/>

</RelativeLayout>

成功:

这里为什么使用LinlearLayout不成功,换成RelativeLayout可以,最终的原因,待研究清楚再总结。

时间: 2024-09-28 21:56:52

FragmentTabHost + Fragment 使用小记的相关文章

Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换

Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换 Android学习笔记:TabHost 和 FragmentTabHost

android FragmentActivity+FragmentTabHost+Fragment框架布局

这周比较闲,计划系统的学习一下android开发,我本是一名IOS程序员,对手机开发还是有自己的一套思路的, 固这套思路用到我当前学android上了,先选择从Main页面的tabbar部分代码入手, Android框架布局方式大致分两种, TabActivity+TabHost+Activity,这种方式已过期, 另一种就是 FragmentActivity+FragmentTabHost+Fragment这种方式是当前最新的方式,也是google推荐使用方式,那么我当然选第二种方式了,于是就

仿oschina 主界面的实现(一) -------FragmentTabHost+Fragment

FragmentTabHost+Fragment 官网的API dome Special TabHost that allows the use of Fragment objects for its tab content. When placing this in a view hierarchy, after inflating the hierarchy you must call setup(Context, FragmentManager, int) to complete the

FragmentTabHostBottomDemo【FragmentTabHost + Fragment实现底部选项卡】

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 使用FragmentTabHost实现底部选项卡效果. 备注:该Demo主要是演示FragmentTabHost的一些设置和部分功能,实际中需要参考其他Demo. 效果图 代码分析 1.该Demo中采用的是FragmentTabHost的布局方案之一[命名为非常规布局写法]:[建议使用常规布局写法,见<FragmentTabHostTopDemo[FragmentTabHost固定宽度且居中]>] 2.未使用自定义的FragmentT

FragmentTabHost+Fragment搭建应用主框架

一.主界面Activity代码 public class MainActivity extends FragmentActivity{ //定义FragmentTabHost对象 private FragmentTabHost mTabHost; //定义一个布局填充器 private LayoutInflater layoutInflater; //定义数组来存放Fragment界面 private Class<?> fragmentArray[] = {HomeFragment.class

FragmentActivity+FragmentTabHost+Fragement替代TabActibvity+TabHost+Activity

自Android3.2之后,TabActibvity被弃用(Deprecated).取而代之的是FragmentActivity.由于Fragment比Activiy更灵活.消耗的资源更小.全然可以满足TabActivity的效果,所以直接替代之.原来的TabActibvity+TabHost+Activity那套还可以用,只是强烈建议改用FragmentActivity+FragmentTabHost+Fragement FragmentTabHost使用方法: 1. 定义FragmentAc

使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab

大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab,实现原理如下: 第一层Tab:FragmentTabHost + Fragment; 第二层Tab:在第一层的Fragment中使用TabLayout和ViewPager实现. 第一层Tab实现: 1.布局文件activity_main

使用FragmentTabHost 完成一个简单的底部导航栏

使用FragmentTabhost+Fragment实现一个底部导航栏 主布局: //放置Fragment <FrameLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/fragment"> </FrameLayou

Android乐学成语之TabHost介绍及使用Fragment 替换 TabActivity

TabHost介绍 TabHost组件可以在界面中存放多个选项卡, 很多软件都使用了改组件进行设计; 1. TabHost常用组件 TabWidget : 该组件就是TabHost标签页中上部 或者 下部的按钮, 可以点击按钮切换选项卡; TabSpec : 代表了选项卡界面, 添加一个TabSpec即可添加到TabHost中; -- 创建选项卡 : newTabSpec(String tag), 创建一个选项卡; -- 添加选项卡 : addTab(tabSpec); TabHost的使用请看