`
苗振忠
  • 浏览: 56702 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端

 
阅读更多

转载请注明出处: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. <RelativeLayoutxmlns: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. packagecom.example.viewpagerandtabdemo;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.os.Bundle;
  5. importandroid.support.v4.app.Fragment;
  6. importandroid.support.v4.app.FragmentTransaction;
  7. importandroid.support.v4.view.ViewPager;
  8. importandroid.support.v4.view.ViewPager.OnPageChangeListener;
  9. importcom.actionbarsherlock.app.ActionBar;
  10. importcom.actionbarsherlock.app.ActionBar.Tab;
  11. importcom.actionbarsherlock.app.SherlockFragmentActivity;
  12. publicclassMainActivityextendsSherlockFragmentActivityimplementsActionBar.TabListener,OnPageChangeListener{
  13. /**
  14. *顶部Tab的title
  15. */
  16. privateString[]mTabTitles;
  17. /**
  18. *ViewPager对象的引用
  19. */
  20. privateViewPagermViewPager;
  21. /**
  22. *装载Fragment的容器,我们的每一个界面都是一个Fragment
  23. */
  24. privateList<Fragment>mFragmentList;
  25. /**
  26. *ActionBar对象的引用
  27. */
  28. privateActionBarmActionBar;
  29. @Override
  30. protectedvoidonCreate(BundlesavedInstanceState){
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.activity_main);
  33. //从资源文件在获取Tab的title
  34. mTabTitles=getResources().getStringArray(R.array.tab_title);
  35. mFragmentList=newArrayList<Fragment>();
  36. mViewPager=(ViewPager)findViewById(R.id.viewPager);
  37. //设置Adapter
  38. mViewPager.setAdapter(newTabPagerAdapter(getSupportFragmentManager(),mFragmentList));
  39. //设置监听
  40. mViewPager.setOnPageChangeListener(this);
  41. //获取Action实例我们使用getSupportActionBar()方法
  42. mActionBar=getSupportActionBar();
  43. //隐藏Title
  44. mActionBar.setDisplayShowTitleEnabled(false);
  45. //隐藏Homelogo
  46. mActionBar.setDisplayShowHomeEnabled(false);
  47. //设置ActionBar的导航模式为Tab
  48. mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
  49. //为ActionBar添加Tab并设置TabListener
  50. for(inti=0;i<mTabTitles.length;i++){
  51. ActionBar.Tabtab=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(inti=0;i<mTabTitles.length;i++){
  58. Fragmentfragment=newItemFragment();
  59. Bundleargs=newBundle();
  60. args.putString("arg",mTabTitles[i]);
  61. fragment.setArguments(args);
  62. mFragmentList.add(fragment);
  63. }
  64. }
  65. @Override
  66. publicvoidonTabSelected(Tabtab,FragmentTransactionft){
  67. //点击ActionBarTab的时候切换不同的Fragment界面
  68. mViewPager.setCurrentItem(tab.getPosition());
  69. }
  70. @Override
  71. publicvoidonTabUnselected(Tabtab,FragmentTransactionft){
  72. }
  73. @Override
  74. publicvoidonTabReselected(Tabtab,FragmentTransactionft){
  75. }
  76. @Override
  77. publicvoidonPageScrollStateChanged(intarg0){
  78. }
  79. @Override
  80. publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
  81. }
  82. @Override
  83. publicvoidonPageSelected(intarg0){
  84. //滑动ViewPager的时候设置相对应的ActionBarTab被选中
  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. packagecom.example.viewpagerandtabdemo;
  2. importjava.util.List;
  3. importandroid.support.v4.app.Fragment;
  4. importandroid.support.v4.app.FragmentManager;
  5. importandroid.support.v4.app.FragmentStatePagerAdapter;
  6. publicclassTabPagerAdapterextendsFragmentStatePagerAdapter{
  7. privateList<Fragment>list;
  8. //构造函数
  9. publicTabPagerAdapter(FragmentManagerfm,List<Fragment>list){
  10. super(fm);
  11. this.list=list;
  12. }
  13. @Override
  14. publicFragmentgetItem(intarg0){
  15. returnlist.get(arg0);
  16. }
  17. @Override
  18. publicintgetCount(){
  19. returnlist.size();
  20. }
  21. }

 

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

  1. packagecom.example.viewpagerandtabdemo;
  2. importandroid.os.Bundle;
  3. importandroid.view.LayoutInflater;
  4. importandroid.view.View;
  5. importandroid.view.ViewGroup;
  6. importandroid.widget.TextView;
  7. importcom.actionbarsherlock.app.SherlockFragment;
  8. publicclassItemFragmentextendsSherlockFragment{
  9. @Override
  10. publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
  11. BundlesavedInstanceState){
  12. ViewcontextView=inflater.inflate(R.layout.fragment_item,container,false);
  13. TextViewmTextView=(TextView)contextView.findViewById(R.id.textview);
  14. //获取Activity传递过来的参数
  15. BundlemBundle=getArguments();
  16. Stringtitle=mBundle.getString("arg");
  17. mTextView.setText(title);
  18. returncontextView;
  19. }
  20. @Override
  21. publicvoidonActivityCreated(BundlesavedInstanceState){
  22. super.onActivityCreated(savedInstanceState);
  23. }
  24. }

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

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

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

 

分享到:
评论

相关推荐

    开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端

    开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端,项目详情:http://blog.csdn.net/xiaanming/article/details/9971721

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

    使用开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签,项目详情http://blog.csdn.net/xiaanming/article/details/10766053

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

    在Android开发中,为了实现类似网易新闻客户端那样的滑动切换页面和顶部Tab标签的效果,开发者通常会使用到`ViewPager`和`ViewPageIndicator`这两个组件。`ViewPager`是Android SDK中的一个视图容器,它允许用户左右...

    ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

    在Android应用开发中,创建一个类似网易新闻客户端的Tab标签界面是常见的需求,这涉及到对UI组件的灵活运用和自定义。在这个场景中,我们主要会用到两个关键的开源库:`ViewPageIndicator`和`ViewPager`。下面将详细...

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

    在本文中,我们将深入探讨如何使用两个流行的开源框架——ViewPageIndicator和ViewPager来实现这种功能。 首先,我们要了解`ViewPager`。它是Android Support Library中的一个组件,主要用于在水平方向上展示多个...

    ActionBarSherlock结合ViewPager及Fragment实现仿新闻客户端顶部滑动切换效果

    "ActionBarSherlock结合ViewPager及Fragment实现仿新闻客户端顶部滑动切换效果"是一个示例项目,它展示了如何利用这些组件来创建一个类似新闻应用程序的顶部导航栏,允许用户通过滑动在不同内容之间切换。...

    仿网易新闻客户端首页滑动框架(ViewPager+SlidingPanelLayout)

    在Android应用开发中,"仿网易新闻客户端首页滑动框架(ViewPager+SlidingPanelLayout)"是一个常见的需求,它涉及到UI设计、布局管理和触摸事件处理等多个技术领域。这个框架主要是通过结合ViewPager和...

    android高仿网易新闻客户端,title可以动态添加或减少

    总结来说,这个高仿网易新闻客户端项目涵盖了Android开发中的多个关键技术和最佳实践,包括RecyclerView的动态数据绑定、ViewPager的页面滑动效果、Fragment的模块化设计,以及STB的遥控器适配。通过深入理解和实践...

    仿网易基本UI架构,Fragment+Viewpager

    在Android应用开发中,"仿网易基本UI架构,Fragment+ViewPager"是一个常见的设计模式,用于构建高效的、可滚动的屏幕视图。这个架构主要用于实现类似网易新闻客户端的多板块滑动浏览效果,允许用户在不同的内容区域...

    仿网易新闻客户端 滑动导航

    标题 "仿网易新闻客户端滑动导航" 描述的是一个针对移动应用开发的示例项目,其核心功能是模仿网易新闻客户端的滑动导航界面。在移动应用设计中,滑动导航是一种常见的用户交互模式,它允许用户通过左右滑动屏幕在...

    Android应用源码之仿 网易新闻客户端 滑动导航-IT计算机-毕业设计.zip

    该压缩包文件包含了一个Android应用源码项目,其主要目标是仿造网易新闻客户端的滑动导航功能。这个项目对于Android开发的学习者,尤其是正在进行毕业设计的学生来说,具有很高的参考价值。下面将详细阐述其中涉及的...

    仿 网易新闻客户端 滑动导航.rar

    在本项目"仿 网易新闻客户端 滑动导航.rar"中,我们主要探讨的是如何实现一个类似于网易新闻客户端的滑动导航功能。这个功能是许多移动应用中的常见设计,它允许用户通过水平滑动来切换不同的内容区域,如新闻分类、...

    Android应用源码之仿 网易新闻客户端 滑动导航.zip

    该压缩包文件“Android应用源码之仿 网易新闻客户端 滑动导航.zip”包含了一个Android应用的源代码,旨在模仿网易新闻客户端的滑动导航功能。这个源码示例对于学习Android开发,特别是对用户界面(UI)设计和滑动...

    Android下高仿网易新闻客户端首页

    在Android开发中,创建一个高仿网易新闻客户端首页是一项挑战性的任务,因为它涉及到多个关键技术和设计元素。这个项目主要关注两个部分:顶部的特效组件和底部的TabHost类似组件。 首先,让我们详细讨论顶部特效...

    Android高级应用源码-仿 网易新闻客户端 滑动导航.rar

    该压缩包文件“Android高级应用源码-仿 网易新闻客户端 滑动导航.rar”提供了一个基于Android平台的高级应用示例,旨在模仿网易新闻客户端的滑动导航功能。滑动导航是现代移动应用中常见的设计模式,允许用户通过...

    安卓Android源码——仿 网易新闻客户端 滑动导航.rar

    这个压缩包文件"安卓Android源码——仿 网易新闻客户端 滑动导航.rar"提供了一个示例,帮助开发者学习如何在自己的应用中实现这一功能。下面我们将深入探讨相关知识点。 首先,滑动导航通常指的是使用TabLayout结合...

    Android-各种方向的ViewPager层叠卡片

    `CardView` 是Android设计支持库中的一个组件,用于创建具有圆角、阴影和 elevation 的卡片样式视图,常与`ViewPager` 结合使用,以创建美观的滑动卡片效果。 首先,我们需要理解`CardView`的基本用法。`CardView`...

    安卓Android源码——仿 网易新闻客户端 滑动导航.zip

    在本项目中,我们主要探讨的是如何在Android平台上开发一个类似网易新闻客户端的滑动导航功能。这个功能是许多移动应用中的常见设计,它允许用户通过左右滑动屏幕在不同的内容板块之间切换,提供了一种直观且易于...

Global site tag (gtag.js) - Google Analytics