开通博客以来已经约莫1个月了。几次想提笔写写东西,但总是由于各种各样的原因并没有开始。现在,年假刚结束,项目也还没有开始,但最终促使我写这篇博客的是,看了一篇博友写的新年计划,说是要在新的一年中写50篇博客,我也心血来潮的定下了这样的目标。把年前项目中用到的FragmentTabHost在这里总结一下。

  现在市面上app的主流框架大体分为两种:一种是在主界面点击菜单按钮,之后会滑出侧滑菜单,之后进入到各个模块,还有一种是在主界面的下面放置若干个tab按钮,点击按钮,切换到不同的模块。今天要讲的就是第二种的实现方式之一的FragmentTabHost.

  FragmentTabHost来自于android.support.v4.app这个包下,继承自TabHost,作为android4.0的控件。好了,废话还是少说为妙。

下面是主界面的布局文件

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context="com.itrui.searchs.MainActivity" >
  6.  
  7. <android.support.v4.app.FragmentTabHost
  8. android:id="@android:id/tabhost"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent">
  11. <LinearLayout
  12. android:layout_width="match_parent"
  13. android:layout_height="match_parent"
  14. android:orientation="vertical"
  15. >
  16. <FrameLayout
  17. android:id="@android:id/tabcontent"
  18. android:layout_width="match_parent"
  19. android:layout_height="0dp"
  20. android:layout_weight="1">
  21. </FrameLayout>
  22. <TextView
  23. android:layout_width="match_parent"
  24. android:layout_height="1px"
  25. android:background="#D0D0D0">
  26. </TextView>
  27. <TabWidget
  28. android:id="@android:id/tabs"
  29. android:layout_width="match_parent"
  30. android:layout_height="?attr/actionBarSize"
  31. android:background="#FFFFFF"
  32. android:layout_gravity="bottom"
  33. android:padding="10dp"
  34. ></TabWidget>
  35. </LinearLayout>
  36. </android.support.v4.app.FragmentTabHost>
  37.  
  38. </RelativeLayout>

控件的命名是固定的不能随便更改。控件的id必须是Android提供的标准id, 即"@android:id"

Tab的布局文件:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. >
  5. <LinearLayout
  6. android:id="@+id/layout_ancor"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_centerHorizontal="true"
  10. android:layout_alignParentBottom="true"
  11. android:gravity="center"
  12. android:orientation="vertical"
  13. android:padding="2dp"
  14. android:paddingBottom="15dp"
  15. android:paddingTop="10dp">
  16. <ImageView
  17. android:id="@+id/img_tab_pic"
  18. android:layout_width="32dp"
  19. android:layout_height="32dp"
  20. />
  21. </LinearLayout>
  22.  
  23. </RelativeLayout>

此布局文件是一张图片,当然你也可以根据自己的需求来添加其他的控件,比如文字之类的控件

其中之一的Fragment的布局:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical" >
  5. <RelativeLayout
  6. android:id="@+id/fragment_main_frist_title"
  7. android:layout_width="match_parent"
  8. android:layout_height="50dp"
  9. android:orientation="horizontal"
  10. >
  11. <TextView
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:gravity="center"
  15. android:paddingTop="10dp"
  16. android:layout_marginLeft="80dp"
  17. android:text="poi搜索"/>
  18. <ImageView
  19. android:id="@+id/iv_baidu_dingwei"
  20. android:layout_width="32dp"
  21. android:layout_height="32dp"
  22. android:paddingTop="10dp"
  23. android:paddingRight="5dp"
  24. android:layout_alignParentRight="true"
  25. android:src="@drawable/baidumap"/>
  26. </RelativeLayout>
  27. <TextView
  28.  
  29. android:layout_width="match_parent"
  30. android:layout_height="wrap_content"
  31. android:text="我是主界面的第一个fragment"/>
  32.  
  33. </LinearLayout>

当然你也可以同一个fragment实现复用。

主页面的代码:

  1. public class MainActivity extends FragmentActivity {
  2.  
  3. private FragmentTabHost myTabhost;
  4. //Tab图片
  5. private int mImages[] = {
  6. R.drawable.tab_assistant_gray,R.drawable.tab_center_gray,R.drawable.tab_contest_gray,R.drawable.tab_counter_gray
  7. };
  8. //标记
    private String mFragmentTags[] ={
  9. "第一个","第二个","第三个","第四个"
  10. };
  11. //加载的Fragment
  12. private Class mFragment[] ={
  13.  
  14. MainFristFragment.class,MainSecondFragment.class,MainThridFragment.class,MainFristFragment.class
  15.  
  16. };
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. requestWindowFeature(Window.FEATURE_NO_TITLE);
  20. getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. initTabHost();
  24. }
  25. private void initTabHost() {
  26. myTabhost = (FragmentTabHost) findViewById(android.R.id.tabhost);
  27. myTabhost.setup(this, getSupportFragmentManager(),android.R.id.tabhost);
  28. //去掉分割线
  29. myTabhost.getTabWidget().setDividerDrawable(null);
  30. for(int i = 0;i<mImages.length;i++){
  31. //对Tab按钮添加标记和图片
  32. TabSpec tabSpec = myTabhost.newTabSpec(mFragmentTags[i]).setIndicator(getImageView(i));
  33. //添加Fragment
  34. myTabhost.addTab(tabSpec,mFragment[i],null);
  35. myTabhost.getTabWidget().getChildAt(i).setBackgroundResource(R.color.white);
  36.  
  37. }
  38.  
  39. }
  40.  
  41. //获取图片资源
  42. private View getImageView(int index){
  43. View view = getLayoutInflater().inflate(R.layout.tab_title, null);
  44. ImageView imageView = (ImageView) view.findViewById(R.id.img_tab_pic);
  45. imageView.setImageResource(mImages[index]);
  46. return view;
  47.  
  48. }
  49.  
  50. }

在onCreat()中执行 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);语句的作用是让手机屏幕保持一种不暗不关闭的效果。通常的应用场景是视频播放器。
总结:

在FragmentTabHost这一个布局中包裹着FrameLayout(也可以换成其他布局主要作用是存放fragment)和TabWidget控件。

执行语句:

myTabhost.setup(this, getSupportFragmentManager(),android.R.id.tabhost);

去掉分割线

myTabhost.getTabWidget().setDividerDrawable(null);

向FragmentTabHost中添加标识和添加图标

TabSpec tabSpec = myTabhost.newTabSpec(mFragmentTags[i]).setIndicator(getImageView(i));

将对应的fragment添加到控件中去

myTabhost.addTab(tabSpec,mFragment[i],null);

其实还是蛮好用的一个控件。

  

FragmentTabHost的基本用法的更多相关文章

  1. FragmentTabHost用法

    FragmentTabHost组成 Tabhost,TabWidget,切换的内容容器FrameLayout 层级关系 ----FragmentTabHost |-----TabWidget |--- ...

  2. 【Android Widget】FragmentTabHost

    android.support.v4包里面提供了FragmentTabHost用来替代TabHost,FragmentTabHost内容页面支持Fragment,下面我们就通过示例来看他的用法 效果图 ...

  3. FragmentTabHost的应用

    原创)FragmentTabHost的应用(fragment学习系列文章之二) 时间 2014-04-14 00:11:46  CSDN博客 原文  http://blog.csdn.net/flyi ...

  4. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  5. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  6. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  7. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  8. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  9. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

随机推荐

  1. NodeJs之OS

    OS Node.js提供了一些基本的底层操作系统的模块OS. API var os = require('os'); console.log('[arch] 操作系统CPU架构'+os.arch()) ...

  2. ES6模块import细节

    写在前面,目前浏览器对ES6的import支持还不是很好,需要用bable转译. ES6引入外部模块分两种情况: 1.导入外部的变量或函数等: import {firstName, lastName, ...

  3. HTML5 语义元素(二)文本内容

    上一篇介绍的是关于页面结构方面的语义元素,本篇介绍文本内容方面,包含:<bdi>.<details>.<summary>.<mark>.<outp ...

  4. Yeoman 官网教学案例:使用 Yeoman 构建 WebApp

    STEP 1:设置开发环境 与yeoman的所有交互都是通过命令行.Mac系统使用terminal.app,Linux系统使用shell,windows系统可以使用cmder/PowerShell/c ...

  5. Hawk 4.6 并行化

    并行化 Hawk支持单机并行化,也就是使用多线程获取数据.它可以控制目前所有任务的数量,为了不给网站造成过大的压力,仅当任务池中的任务数量小于一定值后,才会插入新的任务. 你可以在数据清洗的 执行面板 ...

  6. mybatis_映射查询

    一.一对一映射查询: 第一种方式(手动映射):借助resultType属性,定义专门的pojo类作为输出类型,其中该po类中封装了查询结果集中所有的字段.此方法较为简单,企业中使用普遍. <!- ...

  7. java中的内部类

    /** * 内部类 ?? * 定义在一个内部的类,被称为内部类. * 内部类里有类体,方法体 * 内部类所在的类,被称为外部类. * --------------------------------- ...

  8. Princeton Algorithms week3 Assignment

    这周编程作业是实现检测点共线的算法.和排序算法有关系的地方在于,对斜率排序后可以很快的检测出来哪些点是共线的,另外这个算法的瓶颈也在于排序的性能. 一点收获: java传参数时传递的是值,这很多人都知 ...

  9. XSS 前端防火墙 —— 可疑模块拦截

    上一篇介绍的系统,已能预警现实中的大多数 XSS 攻击,但想绕过还是很容易的. 由于是在前端防护,策略配置都能在源代码里找到,因此很快就能试出破解方案.并且攻击者可以屏蔽日志接口,在自己电脑上永不发出 ...

  10. React单元测试——十八般兵器齐上阵,环境构建篇

    一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套完整的单元测试能在在后续迭代更新中回归错误时候给与警 ...