今天我们要实现的这个效果呢,在Android的应用中十分地常见,我们可以看到下面两张图,无论是系统内置的联系人应用,还是AnyView的阅读器应用,我们总能找到这样的影子,当我们滑动屏幕时,Tab可以相应地完成切换,而当我们点击Tab时,我们的屏幕同样可以完成切换。讲到滑动,我们会立即想到PagerView,讲到ActionBar,我们立即会想到将ActionBar的导航模式。那么,我们今天要做的一件事情就是,通过这些组件的组合,来实现这样一个效果。

按照一般的思路,我们或许会这么做:首先,使用getActionBar()方法获得操作栏,然后我们将操作栏的导航模式设置为Tab,并添加一些Tab,然后实现TabListener接口;其次,我们将多个布局通过Inflater()方法变成View,然后放到ViewPager里面(其实呢,ViewPager就是个容器啦,你换成FrameLayout也是一样的,所以这里可以用Fragment替换就是这个道理),并实现OnPageChangeListener接口就可以了。由此我们可以写出下面的代码:

package com.Android.AnyViewUI;import java.util.ArrayList;import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.View;public class MainActivity extends FragmentActivity implements TabListener,OnPageChangeListener {private ActionBar mActionBar;private ViewPager mViewPager;private TabPagerAdapter mAdapter;private ArrayList<View> mViews;private ArrayList<ActionBar.Tab> mTabs;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_main);//取得ActionBarmActionBar=getActionBar();//以Tab方式导航mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//禁用ActionBar标题mActionBar.setDisplayShowTitleEnabled(false);//禁用ActionBar图标mActionBar.setDisplayUseLogoEnabled(false);//禁用ActionBar返回键mActionBar.setDisplayShowHomeEnabled(false);//添加TabsmTabs=new ArrayList<ActionBar.Tab>();ActionBar.Tab tab0=mActionBar.newTab();tab0.setText("界面一");tab0.setTabListener(this);mTabs.add(tab0);mActionBar.addTab(tab0);ActionBar.Tab tab1=mActionBar.newTab();tab1.setText("界面二");tab1.setTabListener(this);mTabs.add(tab1);mActionBar.addTab(tab1);ActionBar.Tab tab2=mActionBar.newTab();tab2.setText("界面三");tab2.setTabListener(this);mTabs.add(tab2);mActionBar.addTab(tab2);//获取ViewPagermViewPager=(ViewPager)findViewById(R.id.ViewPager);//初始化mViewsmViews=new ArrayList<View>();mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_0, null));mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_1, null));mViews.add(LayoutInflater.from(this).inflate(R.layout.layout_2, null));//初始化mAdaptermAdapter=new TabPagerAdapter(mViews);mViewPager.setAdapter(mAdapter);mViewPager.setOnPageChangeListener(this);//默认显示第二项mViewPager.setCurrentItem(2);}@Overridepublic void onTabReselected(Tab mTab, FragmentTransaction arg1) {}@Overridepublic void onTabSelected(Tab mTab, FragmentTransaction arg1) {if(mViewPager!=null){mViewPager.setCurrentItem(mTab.getPosition());}}@Overridepublic void onTabUnselected(Tab mTab, FragmentTransaction arg1) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageSelected(int Index) {//设置当前要显示的ViewmViewPager.setCurrentItem(Index);//选中对应的TabmActionBar.selectTab(mTabs.get(Index));}}

其中,TabPagerAdapter是一个继承自PagerAdapter的适配器类:

package com.Android.AnyViewUI;import java.util.ArrayList;import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;public class TabPagerAdapter extends PagerAdapter
{private ArrayList<View> mViews;public TabPagerAdapter(ArrayList<View> mViews){this.mViews=mViews;}@Overridepublic void destroyItem(View container, int position, Object object) {((ViewPager)container).removeView(mViews.get(position));}@Overridepublic Object instantiateItem(View container, int position) {((ViewPager)container).addView(mViews.get(position), 0);return mViews.get(position);}@Overridepublic int getCount() {return mViews.size();}@Overridepublic boolean isViewFromObject(View mView, Object mObject) {return (mView==mObject);}}

我们的代码从逻辑上来讲是没有什么问题的,但是当我们试图运行这段代码的时候,我们发现这段代码出了问题,而问题就出在OnTabSelected()上。但是我们冷静下来想了想,没有错啊,那么问题到底出在哪里呢?看到网上的朋友说,这里这个适配器应该继承自FragmentPagerAdapter:

package com.Android.AnyViewUI;import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;public class ViewPagerAdapter extends FragmentPagerAdapter {//定义三个Fragment的索引public static final int Fragment_Index_0=0;public static final int Fragment_Index_1=1;public static final int Fragment_Index_2=2;public ViewPagerAdapter(FragmentManager fragmentManager) {super(fragmentManager);}@Overridepublic Fragment getItem(int Index) {Fragment mFragemnt=null;switch(Index){case Fragment_Index_0:mFragemnt=new Fragment_0();break;case Fragment_Index_1:mFragemnt=new Fragment_1();break;case Fragment_Index_2:mFragemnt=new Fragment_2();break;}return mFragemnt;}@Overridepublic int getCount() {return 3;}}

其中,Fragment_0、Fragment_1、Fragment_2是继承自Fragment的类,由于三个布局基本一样,这里只给出Fragment_0的代码:

package com.Android.AnyViewUI;import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;public class Fragment_0 extends Fragment
{public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View mView=inflater.inflate(R.layout.layout_0, container, false);return mView;}}

现在,我们将开始写好的代码中的mAdapter用这个适配器类去替换,然后我们发现程序可以运行了,可是为什么啊?看了Android文档,上面说FragmentPagerAdapter是实现了PagerAdapter,换句话说,真正起作用的还是PagerAdapter这个类,好,我们回头看这个类,在我们开始的代码中,我们在instantiateItem()、destroyItem()操作的对象始终是View,如果我们把这个View换成Fragment,把View[]换成Fragment[],在类内部使用FragmentManager对Fragment进行管理,我们会发现这样的效果和继承FragmentPagerAdapter是一样的,这样对于这两个适配器的关系我们就已经很明确了。可是,我还是想知道为什么刚开始的那个方法不行呢?希望知道这个问题的答案的朋友,可以告诉我,最后放上效果图:

ViewPager相关文章:

1、Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab

2、Android开发学习之基于ViewPager实现Gallery画廊效果

3、Android开发学习之使用ViewPager+PagerTabStrip制作可滑动的Tab

4、Android开发学习之使用ViewPager打造应用引导界面面

Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab相关推荐

  1. Android开发之ViewPager结合Fragment实现滑动页面的效果(源代码分享)

    前段日子的博客有介绍过关于ViewPager的使用,发现大家对那篇博客都情有独钟,今天我们就在来看一下ViewPager在Fragment中的使用吧,因为ViewPager是在补丁包中添加的低版本的包 ...

  2. android中viewpager+fragment,Android开发之ViewPager+Fragment

    使用步骤 1.Activity的布局文件 android:id="@+id/viewpager" android:layout_width="wrap_content&q ...

  3. Android开发之ViewPager滑动页面效果实现(源代码分享)

    我们先来谷歌官方文档对viewpager的介绍,该类允许用户通过页面翻转左右的数据,需要通过实现PagerAdapter适配器来生成视图显示的页面.因为注意这个类是早期设计和开发的,API可能会改变, ...

  4. android开发actionbar,Android 开发之为ActionBar 添加Actionbar Button

    前几天做App 的时候,做的比较仓促,就没有添加返回按钮,还有就是MainActivity 的Theme 怎么传递到其他Activity 中,今天无意中看到官方的Train,所以就记下来啦,顺便吧Ac ...

  5. android md5加密登录,Android开发之MD5加密

    将字符串进行MD5加密,返回加密后的字符串 public static String encode(String password) { try { StringBuffer sb = new Str ...

  6. Android studio实现底部导航,Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果...

    BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退. ...

  7. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  8. Android开发之旅:组件生命周期(二)

    引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  9. Android开发之旅:应用程序基础及组件

    --成功属于耐得住寂寞的人,接下来几篇将讲述Android应用程序的原理及术语,可能会比较枯燥.如果能够静下心来看,相信成功将属于你. 引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android ...

最新文章

  1. php mongo二级查询时间,php查询MongoDB遇到长整型的问题
  2. 小米语音首席科学家Daniel Povey:下一代Kaldi将走向何方?
  3. pycharm 常用快捷键整理
  4. 【深度学习笔记】Precision、Recall
  5. winform C#的委托事件在winform窗体中传值,也可用于刷新另一窗体(窗体A刷新窗体B)...
  6. 为什么要重写hashcode()方法
  7. 产品设计 | App功能设计的21条注意事项
  8. DNS实现域名负载均衡
  9. 关于搜狐焦点房产的数据分析
  10. opcua客户端实现断线重连_PLCopen amp; OPC UA信息模型
  11. 算法(15)-leetcode-explore-learn-数据结构-运用递归解决二叉树的问题
  12. 如何绘制业务架构图 — 3.分解图
  13. 使用SSIS Slow Changing Transformation组件管理缓慢变化维
  14. mysql第二章_第二章 初识MySQL
  15. php 芝麻认证think_PHP 芝麻信用接入的注意事项
  16. php高德地图计算距离接口,高德地图计算两坐标之间距离
  17. python怎么把两个文件合并工具_python开发目录合并小工具 PathMerge
  18. 简化Simulink的建模与模型重构
  19. matlab高数数学报告,高等数学实验报告matlab参考答案
  20. html双人可悔棋五子棋源码,MATLAB实现五子棋游戏(双人对战、可悔棋).pdf

热门文章

  1. PCDN实现flash无延时直播的技术原理与优点 1
  2. java中 IndexOf()、lastIndexOf()、substring()的用法
  3. Ubuntu 12.04.1 mysql从5.5升级到5.6
  4. JavaScript中Ajax
  5. 守护进程和inetd超级服务器
  6. Zend Studio使用Xdebug调试
  7. 常用的Linux命令行文本处理工具总结
  8. 是什么让你的ExtJS应用程序运行缓慢?
  9. 关于HTML和CSS
  10. Hadoop学习笔记—14.ZooKeeper环境搭建