开源项目AndroidUtil-采用Fragment实现TabHost
原文出自:方杰|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后的代码,有几点区别:
- 3.0之前的应该导入 import android.support.v4.app.*; 这个包中Fragment相关类;3.o之后的可以直接导入android.app.*;
- 3.0之前的MainAcitivity要继承自FragmentActivity,3.0之后的直接继承自Activity;
- 3.0之前 fragmentManager = getSupportFragmentManager();3.0之后 fragmentManager = getFragmentManager();
开源项目AndroidUtil-采用Fragment实现TabHost的更多相关文章
- 开源项目AndroidUtil-採用Fragment实现TabHost
原文出自:方杰|http://fangjie.sinaapp.com/?p=141 转载请注明出处 学习Android也有一段时间了.感觉大部分的Android应用都有非常多类似的组件,所以就打算做了 ...
- 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍
回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...
- 开源项目月刊《HelloGitHub》第 60 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- Diycode开源项目 搭建可以具有下拉刷新和上拉加载的Fragment
1.效果预览 1.1.这个首页就是一个Fragment碎片,本文讲述的就是这个碎片的搭建方式. 下拉会有一个旋转的刷新圈,上拉会刷新数据. 1.2.整体结构 首先底层的是BaseFragment 然后 ...
- Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console、file等。Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别。
Log4J是Apache组织的开源一个开源项目,通过Log4J,可以指定日志信息输出的目的地,如console.file等.Log4J采用日志级别机制,请按照输出级别由低到高的顺序写出日志输出级别. ...
- Fragment为载体可自己主动布局的CardView(GitHub上写开源项目初体验)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 前些天一直在看Android5.0 的Material Desgin,里面新增 ...
- Android开源项目分类汇总
目前包括: Android开源项目第一篇——个性化控件(View)篇 包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView. ...
- GitHub上史上最全的Android开源项目分类汇总 (转)
GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...
- Android开源项目汇总【转】
主要介绍那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView ...
随机推荐
- [转] Maven镜像配置
参考:许晓斌的<Maven实战> 镜像是为了提供更快的服务 如图:X就认为是Y的一个镜像. 编辑settings.xml配置中央仓库镜像: <settings> ... < ...
- AsyncTask 解析
[转载自 http://blog.csdn.net/yanbober ] 1 背景 Android异步处理机制一直都是Android的一个核心,也是应用工程师面试的一个知识点.前面我们分析了Handl ...
- 对话框 自定义 IOS风格 包青天
activity private void showDialog1() { message = "您输入的邮箱后缀不是公司邮箱地址\n将导致您的借款审核不通过,请重新 ...
- HTML案例练习一
发现其实JS也是挺容易的,也挺好玩的,写的一个控制图片移动的小案例,对DOM机制还是不怎么熟. <html> <head> <style type = "tex ...
- myeclipse 'no default proposals' when use 'alt + /'.
solution: Window -> Preferences -> Java -> Editor -> Content Assist -> Advanced in th ...
- 【转】 NSArray copy 问题
转自: http://blog.sina.com.cn/s/blog_6b1e4a060102uz0i.html 好久没写博客了,今天看到同事的代码中用到了 copy 这个 方法,之前也有了解 ...
- iOS子线程操作UI问题检查
iOS开发中,因为大部分函数都不是线程安全的,所以UI子线程中操作UI是非常危险的事,但是有时候因为开发者经验不足,不知道子线程中不能UI,或者知道但是写代码的时候没注意,或者不知道那些函数操作UI了 ...
- C# trace debug TraceListener调试信息详解
在C#编程中,可能要碰到把调试信息输出的问题,我们可以自己把信息显示在某个控件上,但是MS自己提供了一套机制帮助我们输出一些调试信息,这些信息有助于我们判断程序的走向,不用自己再去额外写调试代码了. ...
- POJ 1222 EXTENDED LIGHTS OUT(翻转+二维开关问题)
POJ 1222 EXTENDED LIGHTS OUT 今天真是完美的一天,这是我在poj上的100A,留个纪念,马上就要期中考试了,可能后面几周刷题就没这么快了,不管怎样,为下一个200A奋斗, ...
- CentOS6.5安装LAMP环境APACHE的安装
1.卸载apr.apr-util [root@centos6 LAMP]# yum remove apr apr-util 2.编译安装apr-1.5.1.tar.gz [root@centos6 L ...