1. 程式人生 > >Android 應用開發----ViewPager---PagerTitleStrip新增標題欄

Android 應用開發----ViewPager---PagerTitleStrip新增標題欄

ViewPager 詳解 PagerTabStrip與PagerTitleStrip新增標題欄的異同

一、PagerTitleStrip

先看個簡單的,先上個效果圖,吸引大家一下眼球。

三個頁面間的滑動,此時是帶著上面的標題一塊滑動的。

  

看一下android 對於PagerTabStrip的官方解釋:

PagerTabStrip是ViewPager的一個關於當前頁面、上一個頁面和下一個頁面的一個非互動的指示器。它經常作為ViewPager控制元件的一個子控制元件被被新增在XML佈局檔案中。在你的佈局檔案中,將它作為子控制元件新增在ViewPager中。而且要將它的 android:layout_gravity 屬性設定為TOP或BOTTOM來將它顯示在ViewPager的頂部或底部。每個頁面的標題是通過介面卡的

getPageTitle(int)函式提供給ViewPager的。

1、首先,文中提到:在你的佈局檔案中,將它作為子控制元件新增在ViewPager中。

2、第二,標題的獲取,是重寫介面卡的getPageTitle(int)函式來獲取的。

根據這兩點,我們就可以看程式碼了:

1、XML佈局檔案:

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context="com.example.testviewpage_2.MainActivity" >  
  6.     <android.support.v4.view.ViewPager  
  7.         android:id="@+id/viewpager"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="200dip"  
  10.         android:layout_gravity="center">  
  11.         <android.support.v4.view.PagerTitleStrip  
  12.             android:id="@+id/pagertitle"    
  13.             android:layout_width="wrap_content"    
  14.             android:layout_height="wrap_content"    
  15.             android:layout_gravity="top"  
  16.             />  
  17.     </android.support.v4.view.ViewPager>  
  18. </RelativeLayout>  

清楚的看到我們將.PagerTitleStrip將其作為ViewPager的子控制元件直接嵌入其中;這是第一步;當然android:layout_gravity=""的值要設定為top或bottom。將標題欄顯示在頂部或底部。

2、重寫介面卡的getPageTitle()函式

便於大家有個整體認識,先貼全域性程式碼,然後再逐個講,這段程式碼是在《ViewPager 詳解(二)---詳解四大函式》 直接更改來的,如果不太明白,先看看這篇文章。

  1. package com.example.testviewpage_2;  
  2. /** 
  3.  * @author  harvic 
  4.  * @date 2014.8.12 
  5.  */  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.support.v4.view.PagerAdapter;  
  11. import android.support.v4.view.PagerTitleStrip;  
  12. import android.support.v4.view.ViewPager;  
  13. import android.view.LayoutInflater;  
  14. import android.view.View;  
  15. import android.view.ViewGroup;  
  16. public class MainActivity extends Activity {  
  17.     private View view1, view2, view3;  
  18.     private List<View> viewList;// view陣列  
  19.     private ViewPager viewPager; // 對應的viewPager  
  20.     private List<String> titleList;  //標題列表陣列  
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_main);  
  25.         viewPager = (ViewPager) findViewById(R.id.viewpager);  
  26.         LayoutInflater inflater = getLayoutInflater();  
  27.         view1 = inflater.inflate(R.layout.layout1, null);  
  28.         view2 = inflater.inflate(R.layout.layout2, null);  
  29.         view3 = inflater.inflate(R.layout.layout3, null);  
  30.         viewList = new ArrayList<View>();// 將要分頁顯示的View裝入陣列中  
  31.         viewList.add(view1);  
  32.         viewList.add(view2);  
  33.         viewList.add(view3);  
  34.         titleList = new ArrayList<String>();// 每個頁面的Title資料  
  35.         titleList.add("王鵬");  
  36.         titleList.add("姜語");  
  37.         titleList.add("結婚");  
  38.         PagerAdapter pagerAdapter = new PagerAdapter() {  
  39.             @Override  
  40.             public boolean isViewFromObject(View arg0, Object arg1) {  
  41.                 // TODO Auto-generated method stub  
  42.                 //根據傳來的key,找到view,判斷與傳來的引數View arg0是不是同一個檢視  
  43.                 return arg0 == viewList.get((int)Integer.parseInt(arg1.toString()));  
  44.             }  
  45.             @Override  
  46.             public int getCount() {  
  47.                 // TODO Auto-generated method stub  
  48.                 return viewList.size();  
  49.             }  
  50.             @Override  
  51.             public void destroyItem(ViewGroup container, int position,  
  52.                     Object object) {  
  53.                 // TODO Auto-generated method stub  
  54.                 container.removeView(viewList.get(position));  
  55.             }  
  56.             @Override  
  57.             public Object instantiateItem(ViewGroup container, int position) {  
  58.                 // TODO Auto-generated method stub  
  59.                 container.addView(viewList.get(position));  
  60.                 //把當前新增檢視的位置(position)作為Key傳過去  
  61.                 return position;  
  62.             }  
  63.             @Override  
  64.             public CharSequence getPageTitle(int position) {  
  65.                 // TODO Auto-generated method stub  
  66.                 return titleList.get(position);  
  67.             }  
  68.         };  
  69.         viewPager.setAdapter(pagerAdapter);  
  70.     }  
  71. }  

1、變數

  1. private List<String> titleList;  //標題列表陣列  

申請了一個String陣列,用來儲存三個頁面所對應的標題的

2、初始化

  1. titleList = new ArrayList<String>();// 每個頁面的Title資料  
  2. titleList.add("王鵬");  
  3. titleList.add("姜語");  
  4. titleList.add("結婚");  

在初始化階段增加了這麼一段初始化陣列的程式碼。

3、重寫CharSequence getPageTitle(int )函式

  1. @Override  
  2. public CharSequence getPageTitle(int position) {  
  3.     // TODO Auto-generated method stub  
  4.     return titleList.get(position);  
  5. }  

根據位置返回當前所對應的標題。

大家可以看到,其實這裡僅僅只重寫了getPageTitle()函式,將其根據不同的位置返回不同的字串就可以實現上面的標題欄功能。第一和第二步有關陣列和初始化,其實都是這了這一步,其實我們完全可以用下面這個程式碼來取代它們:

  1. @Override  
  2. public CharSequence getPageTitle(int position) {  
  3.     // TODO Auto-generated method stub  
  4.     switch (position) {  
  5.     case 0:  
  6.         return "XX";  
  7.     case 1:  
  8.         return "XX";  
  9.     case 2:  
  10.         return "XX";  
  11.     default:  
  12.         return "";  
  13.     }  
  14. }  

這樣效果是一樣一樣的,只是程式碼不好維護而已。好了,有關PagerTabStrip的問題,我們就先說到這。

二、PagerTabStrip

同樣,先看個PagerTabStrip做出來的效果是怎樣的。

    

可能看不出太大區別,其實這兩個實現的效果基本差不多,但有兩點不同:

1、PagerTabStrip在當前頁面下,會有一個下劃線條來提示當前頁面的Tab是哪個。

2、PagerTabStrip的Tab是可以點選的,當用戶點選某一個Tab時,當前頁面就會跳轉到這個頁面,而PagerTitleStrip則沒這個功能。

同樣,先看看官方對PagerTabStrip的解釋:

PagerTabStrip是ViewPager的一個關於當前頁面、上一個頁面和下一個頁面的一個可互動的指示器。它經常作為ViewPager控制元件的一個子控制元件被被新增在XML佈局檔案中。在你的佈局檔案中,將它作為子控制元件新增在ViewPager中。而且要將它的 android:layout_gravity 屬性設定為TOP或BOTTOM來將它顯示在ViewPager的頂部或底部。每個頁面的標題是通過介面卡的getPageTitle(int)函式提供給ViewPager的。

可以看到,除了第一句以外的其它句與PagerTitleStrip的解釋完全相同。即用法也是相同的。只是PagerTabStrip是可互動的,而PagerTitleStrip是不可互動的區別。對於區別在哪些位置,即是上面的兩點(是否可點選與下劃線指示條)。

用法與PagerTitleStrip完全相同,即:

1、首先,文中提到:在你的佈局檔案中,將它作為子控制元件新增在ViewPager中。

2、第二,標題的獲取,是重寫介面卡的getPageTitle(int)函式來獲取的。

看看例項:

1、XML佈局

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context="com.example.testviewpage_2.MainActivity" >  
  6.     <android.support.v4.view.ViewPager  
  7.         android:id="@+id/viewpager"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:layout_gravity="center">  
  11.                 <android.support.v4.view.PagerTabStrip  
  12.             android:id="@+id/pagertab"  
  13.             android:layout_width="match_parent"  
  14.             android:layout_height="wrap_content"   
  15.             android:layout_gravity="top"/>  
  16.     </android.support.v4.view.ViewPager>  
  17. </RelativeLayout>  

可以看到,同樣,是將PagerTabStrip作為ViewPager的一個子控制元件直接插入其中,當然android:layout_gravity=""的值一樣要設定為top或bottom。

2、重寫介面卡的getPageTitle()函式

全部程式碼:

  1. package com.example.testviewpage_2;  
  2. /** 
  3.  * @author  harvic 
  4.  * @date 2014.8.13 
  5.  */  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. import android.support.v4.view.PagerAdapter;  
  11. import android.support.v4.view.ViewPager;  
  12. import android.view.LayoutInflater;  
  13. import android.view.View;  
  14. import android.view.ViewGroup;  
  15. public class MainActivity extends Activity {  
  16.     private View view1, view2, view3;  
  17.     private List<View> viewList;// view陣列  
  18.     private ViewPager viewPager; // 對應的viewPager  
  19.     private List<String> titleList;  
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.         viewPager = (ViewPager) findViewById(R.id.viewpager);  
  25.         LayoutInflater inflater = getLayoutInflater();  
  26.         view1 = inflater.inflate(R.layout.layout1, null);  
  27.         view2 = inflater.inflate(R.layout.layout2, null);  
  28.         view3 = inflater.inflate(R.layout.layout3, null);  
  29.         viewList = new ArrayList<View>();// 將要分頁顯示的View裝入陣列中  
  30.         viewList.add(view1);  
  31.         viewList.add(view2);  
  32.         viewList.add(view3);  
  33.         titleList = new ArrayList<String>();// 每個頁面的Title資料  
  34.         titleList.add("王鵬");  
  35.         titleList.add("姜語");  
  36.         titleList.add("結婚");  
  37.         PagerAdapter pagerAdapter = new PagerAdapter() {  
  38.             @Override  
  39.             public boolean isViewFromObject(View arg0, Object arg1) {  
  40.                 // TODO Auto-generated method stub  
  41.                 return arg0 == arg1;  
  42.             }  
  43.             @Override  
  44.             public int getCount() {  
  45.                 // TODO Auto-generated method stub  
  46.                 return viewList.size();  
  47.             }  
  48.             @Override  
  49.             public void destroyItem(ViewGroup container, int position,  
  50.                     Object object) {  
  51.                 // TODO Auto-generated method stub  
  52.                 container.removeView(viewList.get(position));  
  53.             }  
  54.             @Override  
  55.             public Object instantiateItem(ViewGroup container, int position) {  
  56.                 // TODO Auto-generated method stub  
  57.                 container.addView(viewList.get(position));  
  58.                 return viewList.get(position);  
  59.             }  
  60.             @Override  
  61.             public CharSequence getPageTitle(int position) {  
  62.                 return titleList.get(position);  
  63.             }  
  64.         };  
  65.         viewPager.setAdapter(pagerAdapter);  
  66.     }  
  67. }  

這裡的程式碼與PagerTitleStrip的完全相同,就不再講解了。

就這樣,我們就講完了有關PagerTabStrip的簡單使用方法。下面講一講PagerTabStrip的擴充套件。

3、擴充套件:PagerTabStrip屬性更改

在原始碼中,大家可以看到有個工程叫TestViewPage_PagerTabStrip_extension,執行一下,效果是這樣的:

    

在上面兩個圖中可以看到,我更改了兩個地方:

1、下劃線顏色,原生是黑色,我變成了綠色;

2、在Tab標題前加了一個圖片;

下面說說是如何更改的:

1、更改下劃線顏色:

主要靠PagerTabStrip的setTabIndicatorColorResource方法;

程式碼如下:

  1. pagerTabStrip = (PagerTabStrip) findViewById(R.id.pagertab);  
  2. pagerTabStrip.setTabIndicatorColorResource(R.color.green);  

2、新增標題——重寫介面卡CharSequence getPageTitle(int)方法

在CharSequence getPageTitle(int position)方法返回值是,我們不返回String物件,而採用SpannableStringBuilder來構造了下包含圖片的擴充套件String對像;

具體程式碼如下,不再細講,大家可以看看SpannableStringBuilder的使用方法,就可理解了。

  1. @Override  
  2. public CharSequence getPageTitle(int position) {  
  3.     SpannableStringBuilder ssb = new SpannableStringBuilder("  "+titleList.get(position)); // space added before text  
  4.                                         // for  
  5.     Drawable myDrawable = getResources().getDrawable(  
  6.             R.drawable.ic_launcher);  
  7.     myDrawable.setBounds(0, 0, myDrawable.getIntrinsicWidth(),  
  8.             myDrawable.getIntrinsicHeight());  
  9.     ImageSpan span = new ImageSpan(myDrawable,  
  10.             ImageSpan.ALIGN_BASELINE);  
  11.     ForegroundColorSpan fcs = new ForegroundColorSpan(Color.GREEN);// 字型顏色設定為綠色  
  12.     ssb.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);// 設定圖示  
  13.     ssb.setSpan(fcs, 1, ssb.length(),  
  14.             Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);// 設定字型顏色  
  15.     ssb.setSpan(new RelativeSizeSpan(1.2f), 1, ssb.length(),  
  16.             Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
  17.     return ssb;  
  18. }  

三、總結

通過前面的講解,我們應該清楚的認識到PagerTabStrip與PagerTitleStrip在新增標題欄的異同,但他們實現的標題欄效果很不好,不能指定一個頁面一次顯示一個,或者全部顯示,而且標題還滑動。所以註定主流的App都沒有用這個玩意的。所以這裡也只是一個過渡,在開發中,我們也不建議使用這兩個東東。