开源项目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 ...
随机推荐
- 从零开始学习jquery (一)
一.jquery是什么 Jquery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF 1.5+, Safar ...
- shell脚本中echo显示内容带颜色
转自:http://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要 ...
- Day9 - Python 多线程、进程
Python之路,Day9, 进程.线程.协程篇 本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线 ...
- 查看Oracle数据库被锁住的表,删除锁表的进程
锁表处理及查询 查看Oracle数据库被锁住的表,删除锁表的进程 1.查看被锁住的表 SELECT dob.object_name table_name, lo.locked_mode, lo. ...
- 地址栏访问Action,后来方法执行两次
SSH框架,在地址栏输入URL访问Action,后台访问会访问两次.很奇怪. 经排查,最终问题在于方法名称写错了.将getOpinionByPN()修改成queryOpinionByPN(),没有问题 ...
- strace 使用
- Objective-C学习篇05—Foundation框架简介
iOS中所谓的框架,说到底就是一个目录,iOS提供了很多我们可以在应用程序中调用的框架.许多应用程序都使用了如Foundation.UIKit和Core Graphics这些框架.根据你为应用程序选择 ...
- 使用下拉列表框<select>标签,节省空间
下拉列表在网页中也常会用到,它可以有效的节省网页空间.既可以单选.又可以多选.如下代码: 讲解: 1.value: 2.selected="selected": 设置selecte ...
- 你好,C++(33)对象生死两茫茫 6.2.3 一个对象的生与死:构造函数和析构函数
6.2.2 使用类创建对象 完成某个类的声明并且定义其成员函数之后,这个类就可以使用了.一个定义完成的类就相当于一种新的数据类型,我们可以用它来定义变量,也就是创建这个类所描述的对象,表示现实世界中 ...
- 【USACO 1.5.2】回文质数
[题目描述] 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,0 ...