按照一般的思路,我們或許會這么做:首先,使用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;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.layout_main);
- //取得ActionBar
- mActionBar=getActionBar();
- //以Tab方式導航
- mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
- //禁用ActionBar標題
- mActionBar.setDisplayShowTitleEnabled(false);
- //禁用ActionBar圖標
- mActionBar.setDisplayUseLogoEnabled(false);
- //禁用ActionBar返回鍵
- mActionBar.setDisplayShowHomeEnabled(false);
- //添加Tabs
- mTabs=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);
- }
- @Override
- public void onTabReselected(Tab mTab, FragmentTransaction arg1)
- {
- }
- @Override
- public void onTabSelected(Tab mTab, FragmentTransaction arg1)
- {
- if(mViewPager!=null)
- {
- mViewPager.setCurrentItem(mTab.getPosition());
- }
- }
- @Override
- public void onTabUnselected(Tab mTab, FragmentTransaction arg1)
- {
- }
- @Override
- public void onPageScrollStateChanged(int arg0)
- {
- }
- @Override
- public void onPageScrolled(int arg0, float arg1, int arg2)
- {
- }
- @Override
- public void onPageSelected(int Index)
- {
- //設置當前要顯示的View
- mViewPager.setCurrentItem(Index);
- //選中對應的Tab
- mActionBar.selectTab(mTabs.get(Index));
- }
- }
- 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;
- }
- @Override
- public void destroyItem(View container, int position, Object object)
- {
- ((ViewPager)container).removeView(mViews.get(position));
- }
- @Override
- public Object instantiateItem(View container, int position)
- {
- ((ViewPager)container).addView(mViews.get(position), 0);
- return mViews.get(position);
- }
- @Override
- public int getCount()
- {
- return mViews.size();
- }
- @Override
- public 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);
- }
- @Override
- public 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;
- }
- @Override
- public 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畫廊效果