fragment 滑動 viewPager

1. ViewPager要點:

  • ViewPager 是一個佈局管理類(layout manager),用於提供頁面的左右滑動功能,類似於ListView,也有爲ViewPager提供     數據(Fragment)的 adapter 控制類(FragmentPagerAdapter, FragmentStatePagerAdapter)。
  • ViewPager 經常和 Fragment 一起使用,結合ActionBar 的 Tab,實現 tab 頁面的左右滑動。
  • ViewPager 屬於 android sdk 擴展包,若要使用 ViewPager,需要外部導入擴展包:android-support-v4.jar

2. 實現功能:

本例實現的功能效果如下圖所示:
    實現 tab 頁的左右滑動的好處是,由於我們經常習慣單手操作手機,而單手切換 tab 頁是非常困難的,而 tab 頁面的左右滑動     功能正好可以解決這個問題,提供更加方便的交互。




3. 原理說明:

整個應用可以分爲如圖所示的幾個模塊:


  • 主界面Activity 主要由一個 ViewPager 組成,裏面裝載了三個 Fragment 頁面,進行左右滑動;
  • 主界面Activity 的ActionBar 中創建三個 Tab 按鍵(Tab Button);
  • ActionBar 與 ViewPager 之間的交互關係如下:ViewPager 帶動其裝載的三個 Fragment 左右切換的同時,控制其相對應的Action Tab Button 的左右切換;反過來,當用戶手動切換三個 Tab Button 時,控制 ViewPager 中相對應的 Fragment 的切換。

4. 具體步驟:

4.1 新建工程並導入android-support-v4.jar擴展包:

  • 新建一個名爲ActionTabWithSlippingFragment。
  • 導入android-support-v4.jar擴展包:網上很多導入方法都表示要通過 “Project - Properties - Java Build Path - Add External JARs” 進行導入,這樣可以保證編譯通過,但是運行的時候會出錯!這裏我用的導入方法如下:
  • 首先在工程目錄下新建一個文件夾 libs,然後從 "android sdk目錄\extras\android\compatibility\v4" 下將 android-support-v4.jar 手動拷貝到新建的 libs 目錄下,最後右擊工程選擇 “Refresh” 刷新即可,這時可以看到 libs 目錄和 Android Dependencies 目錄下均有 android-support-v4.jar 出現,這就表示導入成功了!如下圖所示:




4.2 創建三個 Fragment 類作爲可滑動的 Tab 頁(view),並由 ViewPager來管理(manager):

  • 創建三個 Fragement 類:Fragment1.java,Fragment2.java,Fragment3.java,同時爲其各自創建佈局視圖文件:fragment1.xml,fragment2.xml,fragment3.xml,分別設置紅(R)、綠(G)、藍(B)背景。
  • Fragment1.java創建如下,關鍵實現其 onCreateView 方法,設置其佈局:
  • [java] view plaincopy
    1. public class Fragment1 extends Fragment {  
    2.   
    3.     @Override  
    4.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
    5.         return inflateAndSetupView(inflater, container, savedInstanceState, R.layout.fragment1);      
    6.     }  
    7.       
    8.     private View inflateAndSetupView(LayoutInflater inflater, ViewGroup container,   
    9.             Bundle savedInstanceState, int layoutResourceId) {  
    10.         View layout = inflater.inflate(layoutResourceId, container, false);  
    11.           
    12.         return layout;  
    13.     }   
    14. }  


  • fragment1.xml 主要定義一個帶有紅色背景的的LinearLayout:
  • [html] view plaincopy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent"  
    5.     android:orientation="vertical"  
    6.     android:background="#FF0000" >  
    7.       
    8.     <TextView  
    9.         android:layout_width="match_parent"  
    10.         android:layout_height="match_parent"  
    11.         android:layout_gravity="center"  
    12.         android:gravity="center"  
    13.         android:text="@string/frag_1"  
    14.         android:textSize="30dp"  
    15.         android:textStyle="bold"  
    16.         android:textColor="#FFFFFF" />  
    17.   
    18. </LinearLayout>  


4.3 創建主界面 Activity:ActionTabWithSlippingFragmentActivity,及其對應的佈局文件:main.xml:

  • 設置 ActionBar 的樣式,如:無回退按鍵、無標題等——setUpActionBar()
  • 初始化並設置 ViewPager,兩個要點:首先要定義並設置 ViewPager 所需要的數據控制類 ViewPagerAdapter,ViewPagerAdapter 必須實現如何返回對應位置的 Fragment、頁數、頁標題;其次,要實現 ViewPager 的翻頁監聽接口(OnPageChangeListener),主要是實現當前頁面被切換時需要導航到對應位置的action tab button,必要的時候,還需要實現在頁面翻動的各個狀態下(正在翻動、翻動即將停止、翻動完全停止)的相應處理——setUpViewPager()
  • 然後需要創建三個 tab button,並實現 tab 的監聽接口:主要是當選擇相應 tab 時,如何切換 ViewPager 的相應頁面——setUpTabs()
  • ActionTabWithSlippingFragmentActivity.java 的實現部分 
  • [java] view plaincopy
    1. public class ActionTabWithSlippingFragmentActivity extends FragmentActivity   
    2.                 implements ActionBar.TabListener{  
    3.       
    4.     private Fragment1 mFragment1 = new Fragment1();  
    5.     private Fragment2 mFragment2 = new Fragment2();  
    6.     private Fragment3 mFragment3 = new Fragment3();  
    7.       
    8.     private static final int TAB_INDEX_COUNT = 3;  
    9.       
    10.     private static final int TAB_INDEX_ONE = 0;  
    11.     private static final int TAB_INDEX_TWO = 1;  
    12.     private static final int TAB_INDEX_THREE = 2;  
    13.       
    14.     private ViewPager mViewPager;  
    15.     private ViewPagerAdapter mViewPagerAdapter;  
    16.       
    17.     /** Called when the activity is first created. */  
    18.     @Override  
    19.     public void onCreate(Bundle savedInstanceState) {  
    20.         super.onCreate(savedInstanceState);  
    21.         setContentView(R.layout.main);  
    22.           
    23.         setUpActionBar();  
    24.         setUpViewPager();  
    25.         setUpTabs();  
    26.     }  
    27.       
    28.     private void setUpActionBar() {  
    29.         final ActionBar actionBar = getActionBar();  
    30.         actionBar.setHomeButtonEnabled(false);  
    31.         actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
    32.         actionBar.setDisplayShowTitleEnabled(false);  
    33.         actionBar.setDisplayShowHomeEnabled(false);  
    34.     }  
    35.       
    36.     private void setUpViewPager() {  
    37.         mViewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());  
    38.           
    39.         mViewPager = (ViewPager)findViewById(R.id.pager);  
    40.         mViewPager.setAdapter(mViewPagerAdapter);  
    41.         mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {  
    42.             @Override  
    43.             public void onPageSelected(int position) {  
    44.                 final ActionBar actionBar = getActionBar();  
    45.                 actionBar.setSelectedNavigationItem(position);  
    46.             }  
    47.               
    48.             @Override  
    49.             public void onPageScrollStateChanged(int state) {  
    50.                 switch(state) {  
    51.                     case ViewPager.SCROLL_STATE_IDLE:  
    52.                         //TODO  
    53.                         break;  
    54.                     case ViewPager.SCROLL_STATE_DRAGGING:  
    55.                         //TODO  
    56.                         break;  
    57.                     case ViewPager.SCROLL_STATE_SETTLING:  
    58.                         //TODO  
    59.                         break;  
    60.                     default:  
    61.                         //TODO  
    62.                         break;  
    63.                 }  
    64.             }  
    65.         });  
    66.     }  
    67.       
    68.     private void setUpTabs() {  
    69.         final ActionBar actionBar = getActionBar();  
    70.         for (int i = 0; i < mViewPagerAdapter.getCount(); ++i) {  
    71.             actionBar.addTab(actionBar.newTab()  
    72.                     .setText(mViewPagerAdapter.getPageTitle(i))  
    73.                     .setTabListener(this));  
    74.         }  
    75.     }  
    76.       
    77.     @Override  
    78.     protected void onDestroy() {  
    79.         super.onDestroy();  
    80.     }  
    81.       
    82.     public class ViewPagerAdapter extends FragmentPagerAdapter {  
    83.   
    84.         public ViewPagerAdapter(FragmentManager fm) {  
    85.             super(fm);  
    86.             // TODO Auto-generated constructor stub  
    87.         }  
    88.   
    89.         @Override  
    90.         public Fragment getItem(int position) {  
    91.             // TODO Auto-generated method stub  
    92.             switch (position) {  
    93.                 case TAB_INDEX_ONE:  
    94.                     return mFragment1;  
    95.                 case TAB_INDEX_TWO:  
    96.                     return mFragment2;  
    97.                 case TAB_INDEX_THREE:  
    98.                     return mFragment3;  
    99.             }  
    100.             throw new IllegalStateException("No fragment at position " + position);  
    101.         }  
    102.   
    103.         @Override  
    104.         public int getCount() {  
    105.             // TODO Auto-generated method stub  
    106.             return TAB_INDEX_COUNT;  
    107.         }  
    108.           
    109.         @Override  
    110.         public CharSequence getPageTitle(int position) {  
    111.             String tabLabel = null;  
    112.             switch (position) {  
    113.                 case TAB_INDEX_ONE:  
    114.                     tabLabel = getString(R.string.tab_1);  
    115.                     break;  
    116.                 case TAB_INDEX_TWO:  
    117.                     tabLabel = getString(R.string.tab_2);  
    118.                     break;  
    119.                 case TAB_INDEX_THREE:  
    120.                     tabLabel = getString(R.string.tab_3);  
    121.                     break;  
    122.             }  
    123.             return tabLabel;  
    124.         }  
    125.     }  
    126.   
    127.     @Override  
    128.     public void onTabReselected(Tab tab, FragmentTransaction ft) {  
    129.         // TODO Auto-generated method stub  
    130.           
    131.     }  
    132.   
    133.     @Override  
    134.     public void onTabSelected(Tab tab, FragmentTransaction ft) {  
    135.         // TODO Auto-generated method stub  
    136.         mViewPager.setCurrentItem(tab.getPosition());  
    137.     }  
    138.   
    139.     @Override  
    140.     public void onTabUnselected(Tab tab, FragmentTransaction ft) {  
    141.         // TODO Auto-generated method stub  
    142.           
    143.     }  
    144. }  

     
  • main.xml 的實現部分:
  • [html] view plaincopy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent" >  
    5.       
    6.     <android.support.v4.view.ViewPager  
    7.         android:id="@+id/pager"  
    8.         android:layout_width="match_parent"  
    9.         android:layout_height="match_parent" >  
    10.     </android.support.v4.view.ViewPager>  
    11. </RelativeLayout>  



4.4 結束語:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章