转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9971721

大家都知道Android的ActionBar是在3.0以上才有的,那么在3.0以下呢,google并没有给我提供在3.0以下支持ActionBar的包,但是外国的大牛JakeWharton实现了在3.0以下使用ActionBar, JakeWharton这位大牛是ActionBarSherlock,Android-ViewPagerIndicator ,NineOldAndroids的作者,非常厉害的一个人,Github的关注量超过2.6K,我左侧的友情链接里面有他的Github的主页链接,有兴趣的朋友可以去follow下他,今天我们使用的是他的开源框架ActionBarSherlock,ActionBarSherlock是让Action Bar功能支持2.X后的所有平台,而且他会自动的判断是调用原生Action Bar还是使用扩展ActionBar,很多知名的应用也使用这个库,我之前对ActionBar也不了解,所以就去下了ActionBarSherlock来好好的了解了解ActionBar的使用

把红色框框标记的文件导入Eclipse里面,我们可以先看下例子,来了解下ActionBar的一些使用情况

  • 我们新建一个Android工程,叫ViewPagerAndTab,然后指定ActionBarSherlock为ViewPagerAndTab的库工程,右键工程--->Properties

通过上面的几步我们就指定ActionBarSherlock为ViewPagerAndTab的库工程,接下来我们就能在3.0以下使用ActionBar,我这里使用的是ActionBar  Tab和ViewPager仿网易新闻,我们看看主要代码的编写

1.先看布局文件,里面一个ViewPager,非常简单

  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:background="@android:color/white">
  6. <android.support.v4.view.ViewPager
  7. android:id="@+id/viewPager"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content" />
  10. </RelativeLayout>

2.MainActivity代码,点击ActionBar的Tab,ViewPager切换不同的Fragment,滑动ViewPager,选中相对应的ActiionBar Tab

  1. package com.example.viewpagerandtabdemo;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.os.Bundle;
  5. import android.support.v4.app.Fragment;
  6. import android.support.v4.app.FragmentTransaction;
  7. import android.support.v4.view.ViewPager;
  8. import android.support.v4.view.ViewPager.OnPageChangeListener;
  9. import com.actionbarsherlock.app.ActionBar;
  10. import com.actionbarsherlock.app.ActionBar.Tab;
  11. import com.actionbarsherlock.app.SherlockFragmentActivity;
  12. public class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener, OnPageChangeListener{
  13. /**
  14. * 顶部Tab的title
  15. */
  16. private String [] mTabTitles;
  17. /**
  18. * ViewPager对象的引用
  19. */
  20. private ViewPager mViewPager;
  21. /**
  22. * 装载Fragment的容器,我们的每一个界面都是一个Fragment
  23. */
  24. private List<Fragment> mFragmentList;
  25. /**
  26. * ActionBar对象的引用
  27. */
  28. private ActionBar mActionBar;
  29. @Override
  30. protected void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.activity_main);
  33. //从资源文件在获取Tab的title
  34. mTabTitles = getResources().getStringArray(R.array.tab_title);
  35. mFragmentList =  new ArrayList<Fragment>();
  36. mViewPager = (ViewPager) findViewById(R.id.viewPager);
  37. //设置Adapter
  38. mViewPager.setAdapter(new TabPagerAdapter(getSupportFragmentManager(), mFragmentList));
  39. //设置监听
  40. mViewPager.setOnPageChangeListener(this);
  41. //获取Action实例我们使用getSupportActionBar()方法
  42. mActionBar = getSupportActionBar();
  43. //隐藏Title
  44. mActionBar.setDisplayShowTitleEnabled(false);
  45. //隐藏Home logo
  46. mActionBar.setDisplayShowHomeEnabled(false);
  47. //设置ActionBar的导航模式为Tab
  48. mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  49. //为ActionBar添加Tab并设置TabListener
  50. for(int i=0; i<mTabTitles.length; i++){
  51. ActionBar.Tab tab = mActionBar.newTab();
  52. tab.setText(mTabTitles[i]);
  53. tab.setTabListener(this);
  54. mActionBar.addTab(tab, i);
  55. }
  56. //将Fragment加入到List中,并将Tab的title传递给Fragment
  57. for(int i=0; i<mTabTitles.length; i++){
  58. Fragment fragment = new ItemFragment();
  59. Bundle args = new Bundle();
  60. args.putString("arg", mTabTitles[i]);
  61. fragment.setArguments(args);
  62. mFragmentList.add(fragment);
  63. }
  64. }
  65. @Override
  66. public void onTabSelected(Tab tab, FragmentTransaction ft) {
  67. //点击ActionBar Tab的时候切换不同的Fragment界面
  68. mViewPager.setCurrentItem(tab.getPosition());
  69. }
  70. @Override
  71. public void onTabUnselected(Tab tab, FragmentTransaction ft) {
  72. }
  73. @Override
  74. public void onTabReselected(Tab tab, FragmentTransaction ft) {
  75. }
  76. @Override
  77. public void onPageScrollStateChanged(int arg0) {
  78. }
  79. @Override
  80. public void onPageScrolled(int arg0, float arg1, int arg2) {
  81. }
  82. @Override
  83. public void onPageSelected(int arg0) {
  84. //滑动ViewPager的时候设置相对应的ActionBar Tab被选中
  85. mActionBar.setSelectedNavigationItem(arg0);
  86. }
  87. }

我们使用ActionBarSherlock的时候不再是继承Activity,而是继承SherlockActivity,SherlockDialogFragment,SherlockFragmentActivity等等,我这里用到Fragment,所以继承SherlockFragmentActivity,我们不能随便设置Activity的theme,以后我们要全屏显示的时候直接设置android:theme="@android:style/Theme.Black.NoTitleBar"

,我们使用ActionBar就不能这样设置了,并且不能随便设置他的Theme,必须是Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar,或者是他们的子样式,不然就会出java.lang.IllegalStateException异常,所以为了自定义ActionBar的Tab,我们必须修改其style

注意:我们还必须删除ViewPagerAndTab工程libs下面的android-support-v4.jar包,因为在ActionBarSherlock已经包含android-support-v4.jar

3.ViewPager的适配器TabPagerAdapter,因为我们用到Fragment,所以我们继承FragmentStatePagerAdapter而不是PagerAdapter

  1. package com.example.viewpagerandtabdemo;
  2. import java.util.List;
  3. import android.support.v4.app.Fragment;
  4. import android.support.v4.app.FragmentManager;
  5. import android.support.v4.app.FragmentStatePagerAdapter;
  6. public class TabPagerAdapter extends FragmentStatePagerAdapter {
  7. private List<Fragment> list;
  8. //构造函数
  9. public TabPagerAdapter(FragmentManager fm, List<Fragment> list) {
  10. super(fm);
  11. this.list = list;
  12. }
  13. @Override
  14. public Fragment getItem(int arg0) {
  15. return list.get(arg0);
  16. }
  17. @Override
  18. public int getCount() {
  19. return list.size();
  20. }
  21. }

4.ItemFragment 继承SherlockFragment,也可以直接继承Fragment,里面的的布局比较简单,一个TextView用来显示从Activity传递过来的ActionBar Tab的title

  1. package com.example.viewpagerandtabdemo;
  2. import android.os.Bundle;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.TextView;
  7. import com.actionbarsherlock.app.SherlockFragment;
  8. public class ItemFragment extends SherlockFragment {
  9. @Override
  10. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  11. Bundle savedInstanceState) {
  12. View contextView = inflater.inflate(R.layout.fragment_item, container, false);
  13. TextView mTextView = (TextView) contextView.findViewById(R.id.textview);
  14. //获取Activity传递过来的参数
  15. Bundle mBundle = getArguments();
  16. String title = mBundle.getString("arg");
  17. mTextView.setText(title);
  18. return contextView;
  19. }
  20. @Override
  21. public void onActivityCreated(Bundle savedInstanceState) {
  22. super.onActivityCreated(savedInstanceState);
  23. }
  24. }

然后我们将上面的Activity的theme设置成android:theme="@style/Theme.Sherlock.Light.DarkActionBar" 运行项目看看效果,下图一是项目的效果,图二是网易的效果

是不是相差很大呢?人家下面的指示条是红色的,我们做出来的是蓝色的,人家选中Tab的字体颜色是红色,我们的不变色等等,那么我们要怎么才能做出网易新闻的那样子的效果,我们需要改变其style,改变如下

  1. <style name="Themes.ActionBarTab" parent="@style/Theme.Sherlock">
  2. <!-- 去除ActionBar的Divider -->
  3. <item name="actionBarDivider">@null</item>
  4. <!-- 设置ActionBar Tab的高度 -->
  5. <item name="actionBarSize">45dip</item>
  6. <!-- 设置ActionBar Tab字体的样式 -->
  7. <item name="actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
  8. <!-- 设置ActionBar Tab的样式,例如下面的红色指引,Tab之间的间隙等等 -->
  9. <item name="actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
  10. <!-- 设置ActionBar的样式,这里简单的设置了ActionBar的背景 -->
  11. <item name="actionBarStyle">@style/Widget.Slider.ActionBar</item>
  12. </style>
  13. <style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">
  14. <item name="backgroundStacked">@drawable/base_action_bar_bg</item>
  15. </style>
  16. <style name="Widget.Sherlock.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText">
  17. <item name="android:textColor">@drawable/selector_tabtext</item>
  18. <item name="android:textSize">15sp</item>
  19. </style>
  20. <style name="Widget.Sherlock.ActionBar.TabView" parent="Widget">
  21. <item name="android:background">@drawable/tab_indicator</item>
  22. <item name="android:paddingLeft">8dip</item>
  23. <item name="android:paddingRight">8dip</item>
  24. </style>

还有一些图片,selector我没有贴出来,可以去下载代码看看效果,改变style运行效果

好了,今天的讲解到此结束,有疑问的朋友请在下面留言,有兴趣的可以看看 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

源码下载,请点击

很多朋友说自己在4.1上面怎么设置style没效果,首先这个库是在2.X的机器上面使用ActionBar,3.0以后就是使用Andriod自带的ActionBar,所以在3.0以上的系统使用的style为android自带的style,所以我们要将style文件做下修改,如下

  1. <style name="Themes.ActionBarTab" parent="@style/Theme.Sherlock">
  2. <!-- 去除ActionBar的Divider -->
  3. <item name="actionBarDivider">@null</item>
  4. <item name="android:actionBarDivider">@null</item>
  5. <!-- 设置ActionBar Tab的高度 -->
  6. <item name="actionBarSize">45dip</item>
  7. <item name="android:actionBarSize">45dip</item>
  8. <!-- 设置ActionBar Tab字体的样式 -->
  9. <item name="actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
  10. <item name="android:actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
  11. <!-- 设置ActionBar Tab的样式,例如下面的红色指引,Tab之间的间隙等等 -->
  12. <item name="actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
  13. <item name="android:actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
  14. <!-- 设置ActionBar的样式,这里简单的设置了ActionBar的背景 -->
  15. <item name="actionBarStyle">@style/Widget.Slider.ActionBar</item>
  16. <item name="android:actionBarStyle">@style/Widget.Slider.ActionBar</item>
  17. </style>
  18. <style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">
  19. <item name="backgroundStacked">@drawable/base_action_bar_bg</item>
  20. <item name="android:backgroundStacked">@drawable/base_action_bar_bg</item>
  21. </style>
  22. <style name="Widget.Sherlock.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText">
  23. <item name="android:textColor">@drawable/selector_tabtext</item>
  24. <item name="android:textSize">15sp</item>
  25. </style>
  26. <style name="Widget.Sherlock.ActionBar.TabView" parent="Widget">
  27. <item name="android:background">@drawable/tab_indicator</item>
  28. <item name="android:paddingLeft">8dip</item>
  29. <item name="android:paddingRight">8dip</item>
  30. </style>

Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端的更多相关文章

  1. 类似掌盟的Tab页 Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签 (转)

    原博客地址  :http://blog.csdn.net/xiaanming/article/details/10766053 本文转载,记录学习用,如有需要,请到原作者网站查看(上面这个网址) 之前 ...

  2. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherlock ...

  3. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签

    之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻clientTab标签的功能,ActionBarSherlock是在3.0下面的机器支持Ac ...

  4. Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了能更好的分享高质量的文章,所以开设了此专栏.文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码.该专栏 ...

  5. Android开源框架ViewPageIndicator和ViewPager实现Tab导航

    前言: 关于使用ViewPageIndicator和ViewPager实现Tab导航,在开发社区里已经有一堆的博客对其进行了介绍,假设我还在这里写怎样去实现.那简直就是老生常谈,毫无新奇感,并且.我也 ...

  6. Android SlidingMenu 仿网易新闻客户端布局

    前面两篇文章中的SlidingMenu都出现在左侧,今天来模仿一下网易新闻客户端左右两边都有SlidingMenu的效果,以下是网易新闻客户端效果: 不扯闲话了,直接进入正题吧 frame_conte ...

  7. Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...

  8. 分享一个仿网易新闻客户端iPhone版的标签式导航ViewController

    该Controller是一个容器,用于容纳其他的controller.效果与网易新闻客户端的标签式导航基本一样: (1)点击上面的标签,可以切换到对应的controller,标签下面的红色提示条的长度 ...

  9. Android 开源框架ActionBarSherlock初探

    1:我的开发环境是Ubuntu12.04下:adt-bundle-linux-x86-20130729. ActionBarSherlock下载地址:http://actionbarsherlock. ...

随机推荐

  1. SVN在ubuntu的安装和使用

    安装: svn客户端:apt-get install subversion ,然后根据提示一步一步,就完成了svn的安装.当然,也可以源码安装 svn,下载 subversion 一个最新版本的源码包 ...

  2. [Python] 发送email的几种方式

    python发送email还是比較简单的,能够通过登录邮件服务来发送,linux下也能够使用调用sendmail命令来发送,还能够使用本地或者是远程的smtp服务来发送邮件,无论是单个,群发,还是抄送 ...

  3. 在unity的scene中画五角星

    使用Gizmos的DrawLine方法画线. 首先在场景中找到五角星的五个定点的坐标,按照一笔画的顺序命名为1,2,3,4,5,如图所示: 接下来就是编写代码了,代码很少,如下所示: using Un ...

  4. 在spring+hibernaet+mysql事务处理中遇到的一些坑

    spring的事务处理本来就是依赖于底层的实现,比如hibernate及数据库本身. 所以,当使用mysql数据库时,首先要确定的是,所操作的对象表是innodb格式的. 1. read-only方法 ...

  5. WinForm常用代码

    //ToolStripSplitButton是标准按钮和下拉按钮的组合,各自工作,但有联系,感觉上后者是没有向下箭头ToolStripDropDownButton:ToolStripDropDownB ...

  6. web前端的学习误区

    web前端的学习误区  网页制作是计算机专业同学在大学期间都会接触到的一门课程,而学习网页制作所用的第一个集成开发环境(IDE)想必大多是Dreamweaver,这种所见即所得的“吊炸天”IDE为我们 ...

  7. ASP.NET中分布式事务的使用

    之前发表了一篇事务的存储过程,最近在做项目的时候遇到分布式事务,所有总结一下,跟大家分享和交流一下经验.首先说明为什么要分布式事务呢?先说说我在项目的哪里遇到分布式事务吧,我是在做网站后台开发的时候, ...

  8. WIFI网络访问(一)

    一,WIFI 网卡有哪些状态? WIFI 总共有以下五个状态,实际就是一些整形常量: 1.   WIFI_STATE_DISABLED : WIFI 不能使用,其值是: 1 . 2.   WIFI_S ...

  9. 求一组数字序列的分布情况(java)

    最近需要做一个正态分布的函数图像所以要处理一段double序列 写了这个算法  先上效果图: 核心思想: 1先根据步长计算每一个区间 2循环进行判断序列中每个数属于哪个区间 3用一个数组来保存每一个区 ...

  10. HDU 1071 - The area

    求曲线和直线围成的面积 求表达式,求积分 #include <iostream> using namespace std; ],y[]; int t; double k,m;//fx1: ...