Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> PagerSlidingTabStrip制作Android帶標簽的多界面滑動切換

PagerSlidingTabStrip制作Android帶標簽的多界面滑動切換

編輯:關於Android編程

這裡我們用到了兩個庫,一個是Android SDK裡自帶的android-support-v4,另一個是PagerSlidingTabStrip,開源項目地址是https://github.com/astuetz/PagerSlidingTabStrip
用v4是需要用到他的ViewPager以及Fragment,而PagerSlidingTabStrip就是應用上邊的標簽。

成果預覽:

2016426175208608.gif (480×854)

下面,開工~
布局

創建Activity什麼的就不說了,喜歡ActionBar就創建一個ActionBarActivity,需要v7 support包。
這裡直接給出此Activity的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <com.astuetz.PagerSlidingTabStrip
    android:id="@+id/tabstrip"
    android:layout_height="48dp"
    android:layout_width="match_parent" />
  <android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:overScrollMode="never"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    android:layout_below="@id/tabstrip" />
</RelativeLayout>

com.astuetz.PagerSlidingTabStrip這貨就是界面上方那幾個標簽。這裡我指定了高度為48dp,這個高度也是Android Design裡強烈建議的可反饋區域的高度。
之前有同事在合作開發App的時候看到他使用RadioGroup做這幾個標簽,又要再加一個View來做下邊的能活動的Indicator,容易出錯不說,代碼復雜度絕對比我下邊要貼出的高很多了。並非是我懶,不願意自己去實現,而是我覺得世上已經有了那麼多別人已經好心好意幫你做完了等你來用的美好的東西,非要自己扭自己搞一套的話,未免有些得不償失。人人都想牛逼,都想做出些比別人更牛逼的東西,但是我認為,如果能把現有的一些好東西完美的結合到一起就已經很不易了。

說了一些無關的觀點,回到正題。很簡單的上下結構布局,不用多說。至於ViewPager中android:overScrollMode="never"是一個小tip,我是不太喜歡ViewPager的越界效果的(fadingEdge="none"並不能生效),這個layout parameter可以使ViewPager的越界效果失效。

代碼

眾所周知,ViewPager中的成員必須是Fragment,所以在配置ViewPager以及PagerSlidingTabStrip之前需要先創建一個簡單的Fragment做ViewPager中的顯示。

package com.airk.myapplication.viewdemo.app.fragments;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.airk.myapplication.simplechat.app.widget.MyTextView; //我自定義的TextView,只是修改了默認字體,最近覺得Roboto-Light/Thin特別好看
/**
 * Simple Fragment which only has one TextView
 */
public class NumberFragment extends Fragment {
  private String content; //Fragment中顯示的內容
  public static NumberFragment newInstance(String content) { //對外提供創建實例的方法,你給我需要顯示的內容,我給你Fragment實例
    return new NumberFragment(content);
  }
  private NumberFragment(String content) {
    this.content = content;
  }
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    MyTextView tv = new MyTextView(getActivity());
    tv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.MATCH_PARENT));
    tv.setGravity(Gravity.CENTER);
    tv.setTextSize(26.0f);
    tv.setText(this.content);
    return tv; //只有一個全屏顯示、居中的Roboto字體的TextView
  }
}

Fragment創建完了,注釋都寫到了代碼裡邊,淺顯易懂,非常簡單。下邊是Activity的代碼:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_activity);
    getSupportActionBar().setDisplayShowHomeEnabled(false); //ActionBar不顯示應用Icon
    ViewPager viewpager = (ViewPager) findViewById(R.id.viewpager); //獲取ViewPager
    viewpager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) { //簡單創建一個FragmentPagerAdapter
      @Override
      public CharSequence getPageTitle(int position) { //必須復寫這個方法,開源控件PagerSlidingTabStrip需要通過它獲取標簽標題
        return "Title " + (position + 1);
      }
      @Override
      public Fragment getItem(int i) {
        return NumberFragment.newInstance("Content " + (i + 1)); //返回剛剛我們創建的那個Fragment,顯示內容為Content X
      }
      @Override
      public int getCount() {
        return 3; //測試只用3個標簽
      }
    });
    PagerSlidingTabStrip strip = (PagerSlidingTabStrip) findViewById(R.id.tabstrip); //獲取PagerSlidingTabStrip控件對象
    strip.setShouldExpand(true); //設置標簽自動擴展——當標簽們的總寬度不夠屏幕寬度時,自動擴展使每個標簽寬度遞增匹配屏幕寬度,注意!這一條代碼必須在setViewPager前方可生效
    strip.setViewPager(viewpager); //這是其所handle的ViewPager
    strip.setDividerColor(Color.TRANSPARENT); //設置每個標簽之間的間隔線顏色 ->透明
    strip.setUnderlineHeight(3); //設置標簽欄下邊的間隔線高度,單位像素
    strip.setIndicatorHeight(6); //設置Indicator 游標 高度,單位像素
  }

PagerSlidingTabStrip這個控件有很多可自定義屬性,包括每個標簽的顏色,字符顏色,間隔的Drawable等等。如果大家有需求可以去仔細看看其github主頁以及官方給出的sample學習一下。

總結
結合開源控件PagerSlidingTabStrip我們很方便的就做到了帶標簽可滑動的多個界面開發,從代碼量上看說實話已經很少了,而且邏輯上也淺顯易懂,甚至都沒有注冊什麼Listener就已經實現了標簽與每個界面的互動(點擊標簽切換界面 or 滑動界面切換標簽),而且Indicator游標也已經被設計成了隨用戶滑動而滑動的,節省了很多開發時間。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved