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