viewpager+fragment學習筆記

jopen 9年前發布 | 12K 次閱讀 Android開發 移動開發 Fragment

有暇,總結一下viewpager+fragment的使用。
先來看看效果圖:
這里寫圖片描述
有三個標題,三個fragment,滑動時標題的顏色會隨著變化。

MainActivity.java

public class MainActivity extends FragmentActivity {

private ViewPager vp;
private Fragment f1, f2, f3;
//把所有的Fragment裝到一個List中
private List<Fragment> fs;
private FragmentPagerAdapter fpa;
private TextView tv1, tv2, tv3;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    vp = (ViewPager) this.findViewById(R.id.vp1);

    initView();

    //一個適配器,里邊存的都是Fragment
    fpa = new FragmentPagerAdapter(getSupportFragmentManager()) {

        @Override
        public int getCount() {
            return fs.size();
        }

        @Override
        public Fragment getItem(int arg0) {
            return fs.get(arg0);
        }
    };

    vp.setAdapter(fpa);

    /**
     * 三個方法的執行順序為:用手指拖動翻頁時,最先執行一遍onPageScrollStateChanged(1),
     * 然后不斷執行onPageScrolled,放手指的時候,直接立即執行一次onPageScrollStateChanged(2),
     * 然后立即執行一次onPageSelected,然后再不斷執行onPageScrolled,
     * 最后執行一次onPageScrollStateChanged(0)。
     */
    vp.setOnPageChangeListener(new OnPageChangeListener() {

        /**
         * position代表哪個頁面被選中
         */
        @Override
        public void onPageSelected(int position) {
            switch (position) {
            case 0:
                changeTitleBackground(0);
                break;
            case 1:
                changeTitleBackground(1);
                break;
            case 2:
                changeTitleBackground(2);
                break;
            default:
                break;
            }
            Log.i("lenve", "onPageSelected"+position);
        }

        /**
         * 有三個參數,第一個position,這個參數要特別注意一下。當用手指滑動時,如果手指按在頁面上不動,
         * position和當前頁面index是一致的
         * 如果手指向左拖動(相應頁面向右翻動),這時候position大部分時間和當前頁面是一致的,
         * 只有翻頁成功的情況下最后一次調用才會變為目標頁面;如果手指向右拖動(相應頁面向左翻動),
         * 這時候position大部分時間和目標頁面是一致的,只有翻頁不成功的情況下最后一次調用才會變為原頁面。
         * 當直接設置setCurrentItem翻頁時,如果是相鄰的情況(比如現在是第二個頁面,跳到第一或者第三個頁面),
         * 如果頁面向右翻動,大部分時間是和當前頁面是一致的,只有最后才變成目標頁面;如果向左翻動,position和目標頁面是一致的。
         * 這和用手指拖動頁面翻動是基本一致的。
         * 如果不是相鄰的情況,比如我從第一個頁面跳到第三個頁面,position先是0,然后逐步變成1,
         * 然后逐步變成2;我從第三個頁面跳到第一個頁面, position先是1,然后逐步變成0,并沒有出現為2的情況。
         * positionOffset是當前頁面滑動比例,如果頁面向右翻動,這個值不斷變大,最后在趨近1的情況后突變為0。
         * 如果頁面向左翻動,這個值不斷變小,最后變為0。
         * positionOffsetPixels是當前頁面滑動像素,變化情況和positionOffset一致。
         */
        // 在屏幕滾動過程中不斷被調用
        @Override
        public void onPageScrolled(int position,float positionOffset, int positionOffsetPixels) {
            Log.i("lenve", "onPageScrolled"+position);
        }

        /**
         * onPageScrollStateChanged(int state):這個方法在手指操作屏幕的時候發生變化。
         * 有三個值:0(END),1(PRESS) , 2(UP) 。 當用手指滑動翻頁時,手指按下去的時候會觸發這個方法,state值為1
         * 手指抬起時,如果發生了滑動(即使很小),這個值會變為2,然后最后變為0
         * 總共執行這個方法三次。一種特殊情況是手指按下去以后一點滑動也沒有發生,這個時候只會調用這個方法兩次,state值分別是1,0 。
         * 當setCurrentItem翻頁時,會執行這個方法兩次,state值分別為2 , 0 。
         */
        @Override
        public void onPageScrollStateChanged(int state) {
            Log.i("lenve", "onPageScrollStateChanged"+state);
        }
    });
    //設置默認顯示頁
    vp.setCurrentItem(0);
}

private void initView() {

    tv1 = (TextView) this.findViewById(R.id.tv1);
    tv2 = (TextView) this.findViewById(R.id.tv2);
    tv3 = (TextView) this.findViewById(R.id.tv3);
    //設置tv1的默認顏色
    tv1.setTextColor(Color.GREEN);

    fs = new ArrayList<Fragment>();

    f1 = new Fragment1();
    f2 = new Fragment2();
    f3 = new Fragment3();
    fs.add(f1);
    fs.add(f2);
    fs.add(f3);
}

//滑動時修改標題顏色
private void changeTitleBackground(int i) {
    switch (i) {
    case 0:
        tv1.setTextColor(Color.GREEN);
        tv2.setTextColor(Color.GRAY);
        tv3.setTextColor(Color.GRAY);
        break;
    case 1:
        tv1.setTextColor(Color.GRAY);
        tv2.setTextColor(Color.GREEN);
        tv3.setTextColor(Color.GRAY);
        break;
    case 2:
        tv1.setTextColor(Color.GRAY);
        tv2.setTextColor(Color.GRAY);
        tv3.setTextColor(Color.GREEN);
        break;
    default:
        break;
    }
}

}</pre>

注釋里邊說的比較清楚了,再看看布局文件:

<LinearLayout xmlns:android="

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:text="f1" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:text="f2" />

    <TextView
        android:id="@+id/tv3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:text="f3" />
</LinearLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/vp1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout></pre>

另外,三個fragment都是普通的fragment,這里就不貼代碼了。

本項目源碼下載

來自:http://blog.csdn.net/u012702547/article/details/46966877

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!