转载本专栏文章,请注明出处,尊重原创 。文章博客地址:道龙的博客

为了能更好的分享高质量的文章,所以开设了此专栏。文章代码都以Android Studio亲测运行,读者朋友可在后面直接下载源码。该专栏是基于Android Studio的精彩案例和一些中高级知识的心得,以及在公司实际开发中遇到的问题等。同时为了保证文章的条理性、高质量性,本专栏的文章更新频率可能比较慢,想看基础性文章可参见博主其它专栏的文章。喜欢我的朋友可以关注我,期待朋友们的关注和指正,大家一起交流学习技术,共同进步。

本篇文章是根据以前一位博主一篇《Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端》地址:http://blog.csdn.net/xiaanming/article/details/9971721   的修改版。那篇文章的代码逻辑是有问题的,也是在eclipse中开发的,但实际放到eclipse中并不能运行。所以本人对此做了优化,同时防到AS中运行,又做了一些改进,比如AS使用ActionBarSherlock 并不能很好的运行(这个还要待证原因,知道的朋友也可留言解决),调试错误调了一天也未果。想了想还是使用原生的ActionBar吧,也可以 实现完全相同的效果。想象谷歌自己的API,使用起来肯定不会出现问题的了~   接下来就来模仿网易新闻客户端吧。

咱先来看看网易新闻客户端长得啥样子:

PS:这个页面是可以通过很多技术手段来完成它的。今天这篇是使用ActionBar+ViewPage+Fragment罢了。

那么就让咱们慢慢来把这个框架搭建起来吧~

首先,我们需要新建一个AS工程,并添加入对应的V7包依赖。AS默认就添加好的

我们看看主要代码的编写:

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

public class MainActivity extends AppCompatActivity implements
ActionBar.TabListener, ViewPager.OnPageChangeListener {
/**
* 顶部Tab的title
*/
private String[] mTabTitles; /**
* ViewPager对象的引用
*/
private ViewPager mViewPager; /**
* 装载Fragment的容器,我们的每一个界面都是一个Fragment
*/
private List<Fragment> mFragmentList = new ArrayList<Fragment>(); /**
* ActionBar对象的引用
*/
private ActionBar mActionBar; private ActionBar.Tab tab; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = (ViewPager) findViewById(R.id.viewPager);
initActionBar();
// 设置监听
mViewPager.setOnPageChangeListener((ViewPager.OnPageChangeListener) this);
} private void initActionBar() { /************ 初始化actionBar组件 ******************/
// 获取Action实例我们使用getSupportActionBar()方法
mActionBar = getSupportActionBar(); // 隐藏Title
mActionBar.setDisplayShowTitleEnabled(false);
// 隐藏Home logo
mActionBar.setDisplayShowHomeEnabled(false);
// 设置ActionBar的导航模式为Tab
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); // 从资源文件在获取Tab的title
mTabTitles = getResources().getStringArray(R.array.tab_title); // 为ActionBar添加Tab并设置TabListener
for (int i = 0; i < mTabTitles.length; i++) {
tab = mActionBar.newTab();
tab.setText(mTabTitles[i]);// 设置tab名称
tab.setTabListener(this);// 设置tab的监听器
mActionBar.addTab(tab, i);// 添加tab,根据位置
} // 将Fragment加入到List中,并将Tab的title传递给Fragment
for (int i = 0; i < mTabTitles.length; i++) {
Fragment fragment = new ItemFragment(); //向fragment传递数据的方法
Bundle args = new Bundle();
args.putString("arg", mTabTitles[i]);
fragment.setArguments(args);// 向fragment传递参数,使用fragment.setArguments(args);数据不会丢失 mFragmentList.add(fragment);//fragment集合
} // 设置Adapter,设置Adapter一定保证有数据源,Adapter绑定数据完毕
mViewPager.setAdapter(new TabPagerAdapter(getSupportFragmentManager(),
mFragmentList)); } @Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override
public void onPageSelected(int position) {
// 滑动ViewPager的时候设置相对应的ActionBar Tab被选中
mActionBar.setSelectedNavigationItem(position);
} @Override
public void onPageScrollStateChanged(int state) { } @Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
// 点击ActionBar Tab的时候切换不同的Fragment界面
mViewPager.setCurrentItem(tab.getPosition());//参数:当前tab的位置
} @Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) { } @Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) { }
}

我们使用ActionBar的时候不再是继承Activity,而是继承ActionBarActivity,或者他的父类AppCompatActivity类,我们不能随便设置Activity的theme,以后我们要全屏显示的时候直接设置android:theme="@android:style/Theme.Black.NoTitleBar",我们使用ActionBar就不能这样设置了,并且不能随便设置他的Theme,必须是Theme.Sherlock.Light,或者是他们的子样式,不然就会出java.lang.IllegalStateException异常,所以为了自定义ActionBar的Tab,我们必须修改其style。在清单文件,你需要修改掉。

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

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 可以直接继承Fragment,里面的的布局比较简单,一个TextView用来显示从Activity传递过来的ActionBar Tab的title

public class ItemFragment extends Fragment {

	@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); Bundle mBundle = getArguments();
String title = mBundle.getString("arg"); mTextView.setText(title); return contextView;
} }

然后我们将上面的Activity的theme设置成android:theme="@style/Theme.Sherlock.Light" 运行项目看看效果:

我们可以看到,核心的效果其实已经做出来了。感兴趣的朋友可以下载源码自己修改一下样式~在这个Fragment流行的时代,使用这样方式也是不错的选择嘛~赶快下载跑起来吧~~

喜欢我的朋友可以关注我。

源码下载地址:点击打开链接

也可以打开微信搜索公众号  Android程序员开发指南  或者手机扫描下方二维码 在公众号阅读更多Android文章。

微信公众号图片:

Android Studio精彩案例(一)《ActionBar和 ViewPager版仿网易新闻客户端》的更多相关文章

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

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

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

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9971721 大家都知道Android的ActionBar是在3.0以上才有的,那么在3 ...

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

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

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

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

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

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

  6. Android Studio精彩案例(七)《ToolBar使用详解<一>》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 本文参考博客:http://blog.csdn.net/h_zhang/article/details/51232773 http:/ ...

  7. Android Studio精彩案例(五)《JSMS短信验证码功能实现》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 很多应用刚打开的时候,让我们输入手机号,通过短信验证码来登录该应用.那么,这个场景是怎么实现的呢?其实是很多开放平台提供了短信验证功能 ...

  8. Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 元旦假期里,闲的无事,看到美团加载数据的动画,就突想写个Demo把动画知识集成一下.后来想了想,还是直接用一个Demo来把所有动画知识 ...

  9. Android Studio精彩案例(三)《模仿微信ViewPage+Fragment实现方式二》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 写在前面的话:此专栏是博主在工作之余所写,每一篇文章尽可能写的思路清晰一些,属于博主的"精华"部分,不同于以往专栏 ...

随机推荐

  1. Windows Socket的UDP和TCP编程介绍

    1:网络中进程之间如何通信 为了实现进程之间通信,首要解决的问题是如何唯一标识一个进程,在本地可以通过进程PID来唯一标识一个进程,但是在网络中则是行不通的,其实TCP/IP协议族已经帮我们解决了这个 ...

  2. nginx 安装及简单配置(适用 小白)

    一.nginxNginx是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存,Nginx可以部署在网络上使用FastCGI脚本.SCGI处理程序.WSGI应用服务器或Phu ...

  3. [HNOI 2013]数列

    Description 题库链接 给你四个数 \(N,K,M,P\) ,让你生成一段长度为 \(K\) 严格单调递增序列,并且满足: 第一位可以为任意元素: 相邻两位的差值不超过 \(M\) : 序列 ...

  4. [HAOI2007]分割矩阵

    题目描述 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个),这样分割了(n-1)次后,原矩阵被分割成了n个矩阵.(每 ...

  5. [HNOI2007]分裂游戏

    Description 聪聪和睿睿最近迷上了一款叫做分裂的游戏. 该游戏的规则试: 共有 n 个瓶子, 标号为 0,1,2.....n-1, 第 i 个瓶子中装有 p[i]颗巧克力豆,两个人轮流取豆子 ...

  6. bzoj 1558: [JSOI2009]等差数列

    Description Solution 把原数组变为差分数组,然后剩下的就十分显然了 区间查询用线段树维护 修改操作就是区间加法和两个单点修改 一个等差数列实际上就是 开头一个数字+数值相等的一段 ...

  7. ●BZOJ 2618 [Cqoi2006]凸多边形

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2618 题解: 计算几何,半平面交. 给出一些凸包,求面积交. 把所有边都取出来,直接办平面交 ...

  8. 四柱加强版汉诺塔HanoiTower----是甜蜜还是烦恼

    我想很多人第一次学习递归的时候,老师或者书本上可能会举汉诺塔的例子. 但是今天,我们讨论的重点不是简单的汉诺塔算法,而是三柱汉诺塔的延伸.先来看看经典的三柱汉诺塔. 一.三柱汉诺塔(Hanoi_Thr ...

  9. Win10 下Cmake编译配置 Opencv3.1 + Cuda7.5 + VS2013

    折腾了三天终于配置成功了,在此写下编译配置的全部步骤和遇到的很多坑. 整体介绍: OpenCV 中 CUDA 实现的函数还不是太多,使用前要在OpenCV的官网上确认以下你想要的功能是否已经实现,否则 ...

  10. centos 7 破解密码

    CentOS 7 root密码的重置方式和CentOS 6完全不一样,CentOS 7与之前的版本6变化还是比较大的,以进入单用户模式修改root密码为例. 1.重启开机按esc   2.按e     ...