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