在ActionBar中添加Tab是很有用的技巧。在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图。我这里定义了个进度条,主要是来说明这个问题。本系列的博文也将接近尾声了,后面就是个定义ActionBar样式和一个仿照微信的实例,顺便讲解下Fragment和ViewPager的用法。

activity_main.xml(定义了一个FrameLayout来准备存放Fragment)

  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. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. tools:context="com.kale.actionbar03.MainActivity" >
  10.  
  11. <FrameLayout
  12. android:id="@+id/container_id"
  13. android:layout_width="match_parent"
  14. android:layout_height="match_parent" />
  15.  
  16. </RelativeLayout>

tab_custom_view.xml(自定义的Tab视图)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <ProgressBar
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:indeterminate="true"/>
  9. </LinearLayout>

MainActivity.java

  1. package com.kale.actionbar03;
  2.  
  3. import android.os.Bundle;
  4. import android.support.v4.app.Fragment;
  5. import android.support.v4.app.FragmentTransaction;
  6. import android.support.v7.app.ActionBar;
  7. import android.support.v7.app.ActionBar.Tab;
  8. import android.support.v7.app.ActionBarActivity;
  9. import android.widget.Toast;
  10.  
  11. public class MainActivity extends ActionBarActivity implements ActionBar.TabListener{
  12. ActionBar actionBar;
  13. private static final String SELECTED_ITEM = "selected_item";
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. actionBar = getSupportActionBar();
  19.  
  20. //actionbar.setDisplayShowHomeEnabled(false);
  21. //actionbar.setDisplayShowTitleEnabled(false);//定义这两行后就会没有标题栏,只有tab栏了
  22.  
  23. //设定有Tab
  24. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  25. ActionBar.Tab tab;
  26. //开始添加Tab
  27. for (int i = 1; i <= 3; i++) {
  28. tab = actionBar.newTab();
  29. tab.setText("Tab " + i);
  30. tab.setTabListener(this);
  31. actionBar.addTab(tab);
  32. }
  33. tab = actionBar.newTab();
  34. tab.setCustomView(R.layout.tab_custom_view);
  35. tab.setText("x");
  36. tab.setTabListener(this);
  37. actionBar.addTab(tab);
  38. }
  39.  
  40. @Override
  41. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  42. super.onRestoreInstanceState(savedInstanceState);
  43. if (savedInstanceState.containsKey(SELECTED_ITEM)) {
  44. //选中前面保存的索引对应的Fragment页
  45. actionBar.setSelectedNavigationItem(savedInstanceState.getInt(SELECTED_ITEM));
  46. }
  47. }
  48.  
  49. @Override
  50. protected void onSaveInstanceState(Bundle outState) {
  51. //将当前选中的fragment页的索引保存到Bundle中
  52. outState.putInt(SELECTED_ITEM, actionBar.getSelectedNavigationIndex());
  53. super.onSaveInstanceState(outState);
  54.  
  55. }
  56.  
  57. /*
  58. * @see android.support.v7.app.ActionBar.TabListener#onTabReselected(android.support.v7.app.ActionBar.Tab, android.support.v4.app.FragmentTransaction)
  59. * Tab再次被选中的时候执行的方法
  60. */
  61. @Override
  62. public void onTabReselected(Tab tab, FragmentTransaction transaction) {
  63.  
  64. }
  65.  
  66. @Override
  67. public void onTabSelected(Tab tab, FragmentTransaction transaction) {
  68. Toast.makeText(getApplicationContext(), tab.getText(), 0).show();
  69. //创建一个新的Fragment的对象
  70. Fragment fragment = new DummyFragment();
  71. //创建一个Bundle对象,用于向Fragment传入参数
  72. Bundle bundle = new Bundle();
  73. bundle.putInt(DummyFragment.BUNDLE_SECTION_NUMBER, tab.getPosition()+1);
  74. //向Fragment传入参数
  75. fragment.setArguments(bundle);
  76.  
  77. FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
  78. //使用fragment
  79. ft.replace(R.id.container_id, fragment);
  80. ft.commit();
  81. }
  82.  
  83. @Override
  84. public void onTabUnselected(Tab tab, FragmentTransaction transaction) {
  85. }
  86.  
  87. }

DummyFragment.java

  1. package com.kale.actionbar03;
  2.  
  3. import android.os.Bundle;
  4. import android.support.annotation.Nullable;
  5. import android.support.v4.app.Fragment;
  6. import android.view.Gravity;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.TextView;
  11.  
  12. public class DummyFragment extends Fragment {
  13.  
  14. public static final String BUNDLE_SECTION_NUMBER = "section_number";
  15.  
  16. // 该返回值就是这个Fragment显示的view组件
  17. @Override
  18. public View onCreateView(LayoutInflater inflater,
  19. @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  20. super.onCreateView(inflater, container, savedInstanceState);
  21. TextView textView = new TextView(getActivity());
  22. textView.setGravity(Gravity.CENTER);
  23. // 获取创建该Fragment时传入的参数的Bundle
  24. Bundle bundle = getArguments();
  25. textView.setText("Fragment 0" + bundle.getInt(BUNDLE_SECTION_NUMBER));
  26. textView.setTextSize(50);
  27. return textView;
  28. }
  29. }

源码下载:http://download.csdn.net/detail/shark0017/7688459

低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment的更多相关文章

  1. 低版本系统兼容的ActionBar(一)设置颜色+添加Menu+添加ActionMode

        之前我一直用ActionBarSherlock这个开源项目来做ActionBar,因为它可以让低版本的设备也能用上ActionBar.但是在最新的SDK中Google提供了一个AppCompa ...

  2. 低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode

           这篇文章主要讲的是在低版本兼容的ActionBar中实现自定义的ActionProvider,ShareActionProvider的使用方法,如何实现分离式ActionBar,外加在分 ...

  3. 低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航

    Tab经常和Fragment结合使用,这一讲我们用3种方式来实现这种快捷导航. 0.重要的两个监听器 MyTabListener,这个我们之前已经接触过了 package com.kale.actio ...

  4. 低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar

           一.自定义MenuItem的视图 custom_view.xml (就是一个单选按钮) <?xml version="1.0" encoding="u ...

  5. 低版本系统兼容的ActionBar(七)自定义Actionbar标题栏字体

    这个自定义字体其实和ActionBar有关,但之前写AtionBar的时候没考虑到修改字体样式,今天看到一篇专门写这个的文章就贴上使用方式.╮(╯▽╰)╭,不得不说Actionbar的那个样式真是让人 ...

  6. 低版本系统兼容的ActionBar(五)修改ActionBar的全套样式,从未如此简单过

         设定ActionBar的样式,是我们必须掌握的技能,在之前我们可能都需要一行一行的写代码,然后在模拟器上测试效果,但是现在我们有个一个很棒的工具来设定样式.设定ActionBar样式的工作从 ...

  7. Android 高版本API方法在低版本系统上的兼容性处理

    Android 版本更替,新的版本带来新的特性,新的方法. 新的方法带来许多便利,但无法在低版本系统上运行,如果兼容性处理不恰当,APP在低版本系统上,运行时将会crash. 本文以一个具体的例子说明 ...

  8. hyperscan在低版本系统应用问题

    编译环境:centos6.3 32位/64位 由于hyperscan使用许多C++11特性,在低版本系统gcc版本不能编译.后来发现在runtime时也就是hs_scan时只需要依赖libhs_run ...

  9. angularjs1+requirejs+ bootstrap+ jQuery低版本配合兼容ie8+浏览器

    angularjs兼容低版本IE浏览器(IE8)angularjs在1.3之后的版本都是选择放弃对IE8及更低IE版本的支持,但是就目前的开发形式来看,IE8的使用客户还是蛮多的,最近有个项目要求尽量 ...

随机推荐

  1. fiddler抓https 关于证书一项

    由于我之前电脑装过fiddler然后这次弄证书也没有理解明白,导致失败了.然后就百度到了下面的教程. https://www.cnblogs.com/joshua317/p/8670923.html ...

  2. 000 SpringMVC介绍

    1.介绍 2.MVC 模型(Model)封装了应用程序数据,通常它们将由POJO类组成. 视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释HTML输出. 控制器(Controlle ...

  3. Linux文件的所有权与权限

    要了解Linux的权限,需要和Linux的用户与组的概念一并理解,不了解的同学请参考Linux的用户和组 简介 在Linux中,每个文件除了有用户和组的信息以外,还有其对应的权限.可使用来查看. [r ...

  4. 学习字典才联想到要和 JSP 说再见了

    最开始只是想让页面能够映射出我的字典值,然而却发现了更大的问题. 假如你自己做一个 demo ,需要前台页面映射出字典数据你会怎么做呢?大致的思路应该是有的,准备字典,准备数据,然后将两部分进行映射. ...

  5. [转]Splay算法

    首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角. 先看一道题目: skydec有n个数,每次他都会把一些数放进一些盒子里,由于skydec太傻×,所以他不能判断数的大小,现在 ...

  6. 在VC++中怎样改变控件间的TAB切换顺序?

    在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.

  7. 解决浏览器抛出乱码,(HTML、PHP等的乱码问题)

    在Windows上编写html或php代码的时候,本地编辑器设置的文件编码格式是utf-8保存,但是浏览器打开页面的时候经常出现乱码,而且浏览器自动检测到的页面编码为GBK格式,这时候我就开始纳闷了? ...

  8. Xtreme8.0 - Magic Square 水题

    Xtreme8.0 - Magic Square 题目连接: https://www.hackerrank.com/contests/ieeextreme-challenges/challenges/ ...

  9. Xcode 模拟器复制解决方案

    网址:http://blog.csdn.net/zhangao0086/article/details/38491271

  10. STM32 通用定时器相关寄存器

    TIMx_CR1(控制寄存器1) 9-8位:CKD[1:0]时钟分频因子,定义在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)使用的采样频率之间的分频比例. 定义:00(tDTS = t ...