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的使用
- 我们先从Github上面先下载这个库,下载地址https://github.com/JakeWharton/ActionBarSherlock,下载好了解压如图
把红色框框标记的文件导入Eclipse里面,我们可以先看下例子,来了解下ActionBar的一些使用情况
- 我们新建一个Android工程,叫ViewPagerAndTab,然后指定ActionBarSherlock为ViewPagerAndTab的库工程,右键工程--->Properties
通过上面的几步我们就指定ActionBarSherlock为ViewPagerAndTab的库工程,接下来我们就能在3.0以下使用ActionBar,我这里使用的是ActionBar Tab和ViewPager仿网易新闻,我们看看主要代码的编写
1.先看布局文件,里面一个ViewPager,非常简单
- <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"
- android:background="@android:color/white">
- <android.support.v4.view.ViewPager
- android:id="@+id/viewPager"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
- </RelativeLayout>
2.MainActivity代码,点击ActionBar的Tab,ViewPager切换不同的Fragment,滑动ViewPager,选中相对应的ActiionBar Tab
- package com.example.viewpagerandtabdemo;
- import java.util.ArrayList;
- import java.util.List;
- import android.os.Bundle;
- import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentTransaction;
- import android.support.v4.view.ViewPager;
- import android.support.v4.view.ViewPager.OnPageChangeListener;
- import com.actionbarsherlock.app.ActionBar;
- import com.actionbarsherlock.app.ActionBar.Tab;
- import com.actionbarsherlock.app.SherlockFragmentActivity;
- public class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener, OnPageChangeListener{
- /**
- * 顶部Tab的title
- */
- private String [] mTabTitles;
- /**
- * ViewPager对象的引用
- */
- private ViewPager mViewPager;
- /**
- * 装载Fragment的容器,我们的每一个界面都是一个Fragment
- */
- private List<Fragment> mFragmentList;
- /**
- * ActionBar对象的引用
- */
- private ActionBar mActionBar;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- //从资源文件在获取Tab的title
- mTabTitles = getResources().getStringArray(R.array.tab_title);
- mFragmentList = new ArrayList<Fragment>();
- mViewPager = (ViewPager) findViewById(R.id.viewPager);
- //设置Adapter
- mViewPager.setAdapter(new TabPagerAdapter(getSupportFragmentManager(), mFragmentList));
- //设置监听
- mViewPager.setOnPageChangeListener(this);
- //获取Action实例我们使用getSupportActionBar()方法
- mActionBar = getSupportActionBar();
- //隐藏Title
- mActionBar.setDisplayShowTitleEnabled(false);
- //隐藏Home logo
- mActionBar.setDisplayShowHomeEnabled(false);
- //设置ActionBar的导航模式为Tab
- mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- //为ActionBar添加Tab并设置TabListener
- for(int i=0; i<mTabTitles.length; i++){
- ActionBar.Tab tab = mActionBar.newTab();
- tab.setText(mTabTitles[i]);
- tab.setTabListener(this);
- mActionBar.addTab(tab, i);
- }
- //将Fragment加入到List中,并将Tab的title传递给Fragment
- for(int i=0; i<mTabTitles.length; i++){
- Fragment fragment = new ItemFragment();
- Bundle args = new Bundle();
- args.putString("arg", mTabTitles[i]);
- fragment.setArguments(args);
- mFragmentList.add(fragment);
- }
- }
- @Override
- public void onTabSelected(Tab tab, FragmentTransaction ft) {
- //点击ActionBar Tab的时候切换不同的Fragment界面
- mViewPager.setCurrentItem(tab.getPosition());
- }
- @Override
- public void onTabUnselected(Tab tab, FragmentTransaction ft) {
- }
- @Override
- public void onTabReselected(Tab tab, FragmentTransaction ft) {
- }
- @Override
- public void onPageScrollStateChanged(int arg0) {
- }
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2) {
- }
- @Override
- public void onPageSelected(int arg0) {
- //滑动ViewPager的时候设置相对应的ActionBar Tab被选中
- mActionBar.setSelectedNavigationItem(arg0);
- }
- }
我们使用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
- package com.example.viewpagerandtabdemo;
- import java.util.List;
- import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentManager;
- import android.support.v4.app.FragmentStatePagerAdapter;
- public class TabPagerAdapter extends FragmentStatePagerAdapter {
- private List<Fragment> list;
- //构造函数
- public TabPagerAdapter(FragmentManager fm, List<Fragment> list) {
- super(fm);
- this.list = list;
- }
- @Override
- public Fragment getItem(int arg0) {
- return list.get(arg0);
- }
- @Override
- public int getCount() {
- return list.size();
- }
- }
4.ItemFragment 继承SherlockFragment,也可以直接继承Fragment,里面的的布局比较简单,一个TextView用来显示从Activity传递过来的ActionBar Tab的title
- package com.example.viewpagerandtabdemo;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
- import com.actionbarsherlock.app.SherlockFragment;
- public class ItemFragment extends SherlockFragment {
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- View contextView = inflater.inflate(R.layout.fragment_item, container, false);
- TextView mTextView = (TextView) contextView.findViewById(R.id.textview);
- //获取Activity传递过来的参数
- Bundle mBundle = getArguments();
- String title = mBundle.getString("arg");
- mTextView.setText(title);
- return contextView;
- }
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- }
- }
然后我们将上面的Activity的theme设置成android:theme="@style/Theme.Sherlock.Light.DarkActionBar" 运行项目看看效果,下图一是项目的效果,图二是网易的效果
是不是相差很大呢?人家下面的指示条是红色的,我们做出来的是蓝色的,人家选中Tab的字体颜色是红色,我们的不变色等等,那么我们要怎么才能做出网易新闻的那样子的效果,我们需要改变其style,改变如下
- <style name="Themes.ActionBarTab" parent="@style/Theme.Sherlock">
- <!-- 去除ActionBar的Divider -->
- <item name="actionBarDivider">@null</item>
- <!-- 设置ActionBar Tab的高度 -->
- <item name="actionBarSize">45dip</item>
- <!-- 设置ActionBar Tab字体的样式 -->
- <item name="actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
- <!-- 设置ActionBar Tab的样式,例如下面的红色指引,Tab之间的间隙等等 -->
- <item name="actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
- <!-- 设置ActionBar的样式,这里简单的设置了ActionBar的背景 -->
- <item name="actionBarStyle">@style/Widget.Slider.ActionBar</item>
- </style>
- <style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">
- <item name="backgroundStacked">@drawable/base_action_bar_bg</item>
- </style>
- <style name="Widget.Sherlock.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText">
- <item name="android:textColor">@drawable/selector_tabtext</item>
- <item name="android:textSize">15sp</item>
- </style>
- <style name="Widget.Sherlock.ActionBar.TabView" parent="Widget">
- <item name="android:background">@drawable/tab_indicator</item>
- <item name="android:paddingLeft">8dip</item>
- <item name="android:paddingRight">8dip</item>
- </style>
还有一些图片,selector我没有贴出来,可以去下载代码看看效果,改变style运行效果
好了,今天的讲解到此结束,有疑问的朋友请在下面留言,有兴趣的可以看看 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签
很多朋友说自己在4.1上面怎么设置style没效果,首先这个库是在2.X的机器上面使用ActionBar,3.0以后就是使用Andriod自带的ActionBar,所以在3.0以上的系统使用的style为android自带的style,所以我们要将style文件做下修改,如下
- <style name="Themes.ActionBarTab" parent="@style/Theme.Sherlock">
- <!-- 去除ActionBar的Divider -->
- <item name="actionBarDivider">@null</item>
- <item name="android:actionBarDivider">@null</item>
- <!-- 设置ActionBar Tab的高度 -->
- <item name="actionBarSize">45dip</item>
- <item name="android:actionBarSize">45dip</item>
- <!-- 设置ActionBar Tab字体的样式 -->
- <item name="actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
- <item name="android:actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
- <!-- 设置ActionBar Tab的样式,例如下面的红色指引,Tab之间的间隙等等 -->
- <item name="actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
- <item name="android:actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
- <!-- 设置ActionBar的样式,这里简单的设置了ActionBar的背景 -->
- <item name="actionBarStyle">@style/Widget.Slider.ActionBar</item>
- <item name="android:actionBarStyle">@style/Widget.Slider.ActionBar</item>
- </style>
- <style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">
- <item name="backgroundStacked">@drawable/base_action_bar_bg</item>
- <item name="android:backgroundStacked">@drawable/base_action_bar_bg</item>
- </style>
- <style name="Widget.Sherlock.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText">
- <item name="android:textColor">@drawable/selector_tabtext</item>
- <item name="android:textSize">15sp</item>
- </style>
- <style name="Widget.Sherlock.ActionBar.TabView" parent="Widget">
- <item name="android:background">@drawable/tab_indicator</item>
- <item name="android:paddingLeft">8dip</item>
- <item name="android:paddingRight">8dip</item>
- </style>
Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端的更多相关文章
- 类似掌盟的Tab页 Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签 (转)
原博客地址 :http://blog.csdn.net/xiaanming/article/details/10766053 本文转载,记录学习用,如有需要,请到原作者网站查看(上面这个网址) 之前 ...
- Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherlock ...
- Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签
之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻clientTab标签的功能,ActionBarSherlock是在3.0下面的机器支持Ac ...
- Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了能更好的分享高质量的文章,所以开设了此专栏.文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码.该专栏 ...
- Android开源框架ViewPageIndicator和ViewPager实现Tab导航
前言: 关于使用ViewPageIndicator和ViewPager实现Tab导航,在开发社区里已经有一堆的博客对其进行了介绍,假设我还在这里写怎样去实现.那简直就是老生常谈,毫无新奇感,并且.我也 ...
- Android SlidingMenu 仿网易新闻客户端布局
前面两篇文章中的SlidingMenu都出现在左侧,今天来模仿一下网易新闻客户端左右两边都有SlidingMenu的效果,以下是网易新闻客户端效果: 不扯闲话了,直接进入正题吧 frame_conte ...
- Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...
- 分享一个仿网易新闻客户端iPhone版的标签式导航ViewController
该Controller是一个容器,用于容纳其他的controller.效果与网易新闻客户端的标签式导航基本一样: (1)点击上面的标签,可以切换到对应的controller,标签下面的红色提示条的长度 ...
- Android 开源框架ActionBarSherlock初探
1:我的开发环境是Ubuntu12.04下:adt-bundle-linux-x86-20130729. ActionBarSherlock下载地址:http://actionbarsherlock. ...
随机推荐
- UVA 100 - The 3n+1 problem (3n+1 问题)
100 - The 3n+1 problem (3n+1 问题) /* * 100 - The 3n+1 problem (3n+1 问题) * 作者 仪冰 * QQ 974817955 * * [问 ...
- PHP - 多维数组
多维数组指的是包含一个或多个数组的数组. PHP 能理解两.三.四或五级甚至更多级的多维数组.不过,超过三级深的数组对于大多数人难于管理. 注释:数组的维度指示您需要选择元素的索引数. 对于二维数组, ...
- vb.NET基础总结
vb.NET语言的学习,相对于原来的添加了.net平台,也 是基于对vb学习的继承与扩展,是在面向对象基础上的编程语言,vb中学到的控制语句,主要的数据类型,对象的事件,方法,属性等继续应用于vb.n ...
- centos网速特别慢的最佳解决的方法 - 关闭ipv6
我使用了centOS,可是发现网速实在是卡得差点儿不能上网,连百度都打不开,可是win却飞快. 后来想到偶然记得有一次看过一段话,说到关闭ipv6,測试来一下,果然有效,关闭来ipv6打开网速飞快. ...
- 跟我一起学extjs5(18--模块的新增、改动、删除操作)
跟我一起学extjs5(18--模块的新增.改动.删除操作) 上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...
- 基于angularJS和requireJS的前端架构
1.概要描述 1.1.angularJS描述:angularJS是可以用来构建WEB应用的,WEB应用中的一种端对端的完整解决方案.通过开发者呈现一个更高层次的抽象来简化应用的开发.最适合的就是用它来 ...
- Java - 反射机制 2
package spring.classloader; import java.lang.reflect.Constructor; import java.lang.reflect.Field; im ...
- 面试前的准备---C#知识点回顾----01
过完年来,准备找份新工作,虽然手里的工作不错,但树挪死,人挪活.咱不能一直在一个坑里生活一辈子,外面的世界毕竟是很美好的. 为了能正常的找到自己中意的工作,最近是将所有的基础知识拿出来复习了一次.仅作 ...
- OC准备知识
#import 与 #include区别 include完成头文件的导入,可能会导致头文件的相互引用和函数或变量的重复定义 为了解决这个问题 我们必须这样做 #ifndef Student_h #de ...
- Java File 类的使用方法详解(转)
转自:http://www.codeceo.com/article/java-file-class.html Java File类的功能非常强大,利用Java基本上可以对文件进行所有的操作.本文将对J ...