原文出自:方杰|http://fangjie.info/?p=141 转载请注明出处

学习Android也有一段时间了,感觉大部分的Android应用都有很多类似的组件,所以就打算做了这样一个开源项目,目的是整合一些Android开发常用的组件Demo,方便以后项目中直接拿来用。git地址:https://github.com/JayFang1993/AndroidUtil

废话不多说,首先讲第一个常用的组件TabHost的实现。之前我们可以通过继承TabActivity来实现,后来的API中已经不建议用这种方式了,所以今天我们主要讲的是用Fragment来实现Tabhost。
在新浪微博等很多APP中都有底部选项卡TabHost。首先看下实现后的效果。

一、TabHost的实现

Tabhost的每一个选项卡是通过RadioGroup实现的,每一个Tab就是一个RadioButton。页面除TabHost以外的内容区域是Fragment。下面是具体的布局文件main.xml

<RelativeLayout 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"
    tools:context=".MainActivity" >
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="48dp"
        android:layout_centerHorizontal="true"
        android:gravity="center"
        android:id="@+id/title"
        android:text="昌大软院"
        android:textSize="18dp"
        android:textColor="#a8aeb5"
        android:typeface="monospace"
        android:background="@drawable/title_bg" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="Done"
        android:textColor="#a8aeb5"
        android:layout_marginTop="10dp"
        android:layout_marginRight="8dp"
        android:background="@drawable/done" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/back"
        android:textColor="#a8aeb5"
        android:text="Back"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="8dp"
        />

    <FrameLayout
         android:id="@+id/content"
         android:layout_below="@id/title"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"/> 

    <RadioGroup
        android:id="@+id/main_radio"
        android:layout_width="fill_parent"
        android:layout_height="48dp"
        android:layout_gravity="bottom"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"
        android:background="@drawable/tabhost_bg" >
        <RadioButton
            android:id="@+id/rb_home"
            android:drawableTop="@drawable/tab1"
            style="@style/tab"
            android:text="主页" />
        <RadioButton
            android:id="@+id/rb_at"
            style="@style/tab"
            android:drawableTop="@drawable/tab2"
            android:text="收藏夹" />
        <RadioButton
            android:id="@+id/rb_mess"
            style="@style/tab"
            android:drawableTop="@drawable/tab3"
            android:text="我" />
        <RadioButton
            android:id="@+id/rb_more"
            style="@style/tab"
            android:drawableTop="@drawable/tab4"
            android:text="更多" />
    </RadioGroup>
</RelativeLayout>

每一个Tab的样式:宽度、高度、背景图片这些都是相同的。所以写在了一个style文件中。styles.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="tab">
        <item name="android:layout_height">48dp</item>
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_weight">1</item>
        <item name="android:gravity">center</item>
        <item name="android:textSize">10dp</item>
        <item name="android:paddingTop">8dp</item>
        <item name="android:background">@drawable/tabhost_bg_selector</item>
        <item name="android:textColor">#a8aeb5</item>
        <item name="android:button">@null</item>
    </style>
</resources>

为了能够制造出Tab按下选中的效果,所以为Tab的背景设计了一个selector。tabhost_bg_selector.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/tabhost_press"  android:state_pressed="true" />
    <item android:drawable="@drawable/tabhost_press" android:state_checked="true" />
    <item android:drawable="@drawable/tabhost_bg"/>
</selector>

至此,关于TabHost的所有布局文件都写完了。下面看看Activity中的Java代码。MainActivity.java

public class MainActivity extends FragmentActivity {
    private FragmentManager fragmentManager;
    private RadioGroup radioGroup;
    private RadioButton rb1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        fragmentManager = getSupportFragmentManager();
        radioGroup = (RadioGroup) findViewById(R.id.main_radio);
        rb1=(RadioButton) findViewById(R.id.rb_home);
        radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @SuppressLint("NewApi")
        public void onCheckedChanged(RadioGroup group, int checkedId) {
                rb1.setBackgroundDrawable(getResources().getDrawable(R.drawable.tabhost_bg_selector));
                FragmentTransaction transaction = fragmentManager.beginTransaction();
                ContentFrame fragment = null;
                switch(checkedId)
                {
                    case 0:
                        fragment= new ContentFrame();
                        break;
                    case 1:
                        fragment= new ContentFrame();
                        break;
                    case 2:
                        fragment= new ContentFrame();
                        break;
                    case 3:
                        fragment= new ContentFrame();
                        break;
                    default:
                        fragment= new ContentFrame();
                        break;
                }
                transaction.replace(R.id.content, (Fragment)fragment);
                transaction.commit();
            }
        });
        //设置默认选中第一项
        radioGroup.check(1);
        radioGroup.check(0);
        //设置按下的背景效果
        rb1.setBackgroundDrawable(getResources().getDrawable(R.drawable.tabhost_press));
    }
}

针对每一个选项卡的内容界面代码,随便写一个布局文件content.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/content"
        />
</LinearLayout>

内容部分的Java代码,实现和Activity差不多,不过这里需要继承Fragment而不是Activity。从content.xml中得到一个View,然后将这个View替换Main中的Fragment部分。

public class ContentFrame extends Fragment{
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.content, null);
        TextView textView = (TextView) view.findViewById(R.id.content);
        textView.setText("Hello world");
        return view;
    }
}

 补充:以上代码是考虑到Android 3.0以前API中没有Fragment,导入android-support-v4.jar后的代码,有几点区别:

  1. 3.0之前的应该导入  import android.support.v4.app.*; 这个包中Fragment相关类;3.o之后的可以直接导入android.app.*;
  2. 3.0之前的MainAcitivity要继承自FragmentActivity,3.0之后的直接继承自Activity;
  3. 3.0之前   fragmentManager = getSupportFragmentManager();3.0之后  fragmentManager = getFragmentManager();

开源项目AndroidUtil-采用Fragment实现TabHost的更多相关文章

  1. 开源项目AndroidUtil-採用Fragment实现TabHost

    原文出自:方杰|http://fangjie.sinaapp.com/?p=141 转载请注明出处 学习Android也有一段时间了.感觉大部分的Android应用都有非常多类似的组件,所以就打算做了 ...

  2. 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍

    回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...

  3. 开源项目月刊《HelloGitHub》第 60 期

    兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...

  4. Diycode开源项目 搭建可以具有下拉刷新和上拉加载的Fragment

    1.效果预览 1.1.这个首页就是一个Fragment碎片,本文讲述的就是这个碎片的搭建方式. 下拉会有一个旋转的刷新圈,上拉会刷新数据. 1.2.整体结构 首先底层的是BaseFragment 然后 ...

  5. Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console、file等。Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别。

    Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console.file等.Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别. ...

  6. Fragment为载体可自己主动布局的CardView(GitHub上写开源项目初体验)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 前些天一直在看Android5.0 的Material Desgin,里面新增 ...

  7. Android开源项目分类汇总

    目前包括: Android开源项目第一篇——个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...

  8. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  9. Android开源项目汇总【转】

    主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView ...

随机推荐

  1. Eclipse中使用git把项目导入到osc@git中

    方便Eclipse用户使用Git把项目导入到osc@git中进行管理. Eclipse Git osc@git 一.原有项目:  项目名为TestGit 二.在osc@git上面创建一个新项目库. 填 ...

  2. Creating a Navigation Drawer 创建一个导航侧边栏

    The navigation drawer is a panel that displays the app’s main navigation options on the left edge of ...

  3. Android开发系列(一)Activity与Fragment获取屏幕获取屏幕像素的不同方式

    Activity中常用的获取屏幕像素代码: //获取屏幕像素相关信息 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getD ...

  4. 使用out来返回多个值

    一般的方法中,一次只能有一个返回值.但是当我们需要一个方法给我们返回多个值得时候应该怎么做呢?这时候可以使用out来修饰参数. out介绍: static void Main(string[] arg ...

  5. PLSQL远程连接到Oracle服务器

    这里只介绍一种远程连接服务器方法,即本机安装了Oracle客户端和PLSql工具,服务器安装在虚拟机或者另一台电脑上 1.打开Oracle客户端的Net Manager,选择Oracle Net配置— ...

  6. STL中的set容器

    #include <iostream> #include <set> using namespace std; int main() { set<int> s; s ...

  7. KB006: CSS 框模型( Box module )

    框和布局 在 KB005: CSS 层叠 中已经介绍了 CSS 的重要之处.CSS 可以说是页面表现的基础, CSS 可以控制布局,控制元素的渲染. 布局是讲在电影画面构图中,对环境的布置.人物地位的 ...

  8. 【转载】ASP.NET页面运行机制以及请求处理流程

    本文转至 ASP.NET页面运行机制以及请求处理流程 IIS处理页面的运行机制 IIS自身是不能处理像ASPX扩展名这样的页面,只能直接请求像HTML这样的静态文件,之所以能处理ASPX这样扩展名的页 ...

  9. PAT - IO - 螺旋方阵

    所谓“螺旋方阵”,是指对任意给定的N,将1到N*N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入NxN的方阵里.本题要求构造这样的螺旋方阵. 输入格式: 输入在一行中给出一个正整数N(< ...

  10. javescript扩展方法

    <script type="text/javascript"> //扩展方法 '原型'->'prototype' //通过类对像的prototype设置扩展方法 ...