ViewPagerIndicator系列之--ViewPager+ActionBar+Fragment实现响应式可滑动Tab
来源:互联网 发布:怎么看淘宝店 编辑:程序博客网 时间:2024/05/18 02:48
今天我们要实现的这个效果呢,在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); //获取ViewPager mViewPager=(ViewPager)findViewById(R.id.ViewPager); //初始化mViews mViews=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)); //初始化mAdapter mAdapter=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);}}
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是一样的,这样对于这两个适配器的关系我们就已经很明确了。可是,我还是想知道为什么刚开始的那个方法不行呢?希望知道这个问题的答案的朋友,可以告诉我,最后放上效果图:
0 0
- ViewPagerIndicator系列之--ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- Android开发之ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- Android UI 详解之ActionBar+ViewPager+Fragment 实现滑动Tab
- ActionBar(7) ActionBar+ViewPager+Fragment 实现可左右滑动的Tab页布局
- 利用ViewPager+Fragment+actionbar实现可左右滑动的Action Tab
- 利用ViewPager+Fragment+actionbar实现可左右滑动的Action Tab
- 利用ViewPager+Fragment+actionbar实现可左右滑动的Action Tab
- 利用ViewPager+Fragment+actionbar实现可左右滑动的Action Tab
- 利用ViewPager+Fragment+actionbar实现可左右滑动的Action Tab
- ActionBar(6) ActionBar+ViewPager 实现可左右滑动的Tab页布局
- ActionBar(5) ActionBar+ViewPager+PagerTitleStrip 实现可左右滑动的Tab页布局
- Tab 滑动标签,综合ViewPager+Fragment+自定义Tab+ActionBar内容
- Android Tab实现之Viewpager+ViewpagerIndicator
- Android ActionBar+ViewPager 实现左右滑动Tab
- Android ActionBar+ViewPager 实现左右滑动Tab
- UVa 10530 - Guessing Game
- where 子语句复杂条件的标准形式
- 分治、栈与数据结构
- Ubuntu udev rules 设置方法
- 前台JSON字符串转换为JSON对象
- ViewPagerIndicator系列之--ViewPager+ActionBar+Fragment实现响应式可滑动Tab
- Longest Valid Parentheses (Java)
- mysql 下 计算 两点 经纬度 之间的距离 计算结果排序
- ACM 容斥原理
- gcc去掉dll导出函数多余的符号
- 纠正要求修改数据库NLS_LENGTH_SEMANTICS参数的错误要求
- javascript读书笔记2----使用原型进行扩展的一个需要注意的地方
- POJ 2976 Dropping tests(初遇0,1分数规化)
- Lintcode - Majority Number II