ViewPager + Fragment 替換 TabActivity

ViewPager + Fragment 替換 TabActivity

Fragment+ViewPager 替換 TabActivity
之前首頁的框架採用TabActivity+Activity的形式實現,首頁頁面切換時,性能消耗較大,本次修改可以大大節約頁面切換性能。
下面是這次框架調整的一些具體內容
思路
使用ViewPager作爲首頁的容器,替換TabActivity;
使用Fragment作爲具體頁面的容器,替換Activity;
將Fragment添加到ViewPager中,以實現頁面切換。
實現
ViewPager實現
引入:
ViewPager可以通過layout

 

  1. <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     android:layout_width="match_parent" 
  3.     android:layout_height="fill_parent" 
  4.     android:background="#ffffff" 
  5.     android:flipInterval="30" 
  6.     android:persistentDrawingCache="animation" 
  7.     android:layout_centerInParent="true" 
  8.      > 
  9. </android.support.v4.view.ViewPager> 
適配器:
因爲ViewPager中存放的是一系列的Fragment,所以需要一個Fragment的適配器,該適配器中保存了對首頁各個Fragment的列表的引用。

 

  1. public class MainFragmentPagerAdapter extends FragmentPagerAdapter { 
  2. private ArrayList<Fragment> fragments; 
  3. public MainFragmentPagerAdapter(FragmentManager fm) { 
  4. super(fm); 
  5. // TODO Auto-generated constructor stub 
  6. public MainFragmentPagerAdapter(FragmentManager fm,ArrayList<Fragment> fragments){ 
  7. super(fm); 
  8. this.fragments = fragments; 
  9. /* (non-Javadoc) 
  10.  * @see android.support.v4.app.FragmentPagerAdapter#getItem(int) 
  11.  */ 
  12. @Override 
  13. public Fragment getItem(int arg0) { 
  14. return fragments.get(arg0); 
  15. /* (non-Javadoc) 
  16.  * @see android.support.v4.view.PagerAdapter#getCount() 
  17.  */ 
  18. @Override 
  19. public int getCount() { 
  20. return fragments.size(); 
  21. @Override 
  22. public int getItemPosition(Object object) { 
  23. // TODO Auto-generated method stub 
  24. return super.getItemPosition(object); 
事件:
這裏主要處理兩個事件,1.OnPageChange事件;2.OnTouch事件
這兩個事件的任務是:
1.OnPageChange事件,當頁面發生切換時,通知底部工具欄改變焦點,以實現底部工具欄和頁面之間同步。
2.OnTouch事件,該事件用於分發touch事件,解決與“主頁”中的Gallery橫屏時事件衝突的問題。

 

  1. viewPager.setOnPageChangeListener(pageChangeListener); 
  2. viewPager.setOnTouchListener(touchListener); 
  3. pageChangeListener定義如下: 
  4. private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { 
  5. @Override 
  6. public void onPageSelected(int arg0) { 
  7. setIconSelected(arg0); 
  8. @Override 
  9. public void onPageScrolled(int arg0, float arg1, int arg2) { 
  10. @Override 
  11. public void onPageScrollStateChanged(int arg0) { 
  12. }; 
touchListener定義如下:

 

  1. private OnTouchListener touchListener = new OnTouchListener(){ 
  2. @Override 
  3. public boolean onTouch(View v, MotionEvent event) { 
  4. if (currentIndex != 0) { 
  5. return false
  6. int[] location = new int[2]; 
  7. homeFragment.gallery.getLocationOnScreen(location); 
  8. if (location[0] != 0) { 
  9. return false
  10. if (event.getRawY() > location[1
  11. && event.getRawY() - location[1] < homeFragment.gallery 
  12. .getHeight()) { 
  13. return homeFragment.gallery.dispatchTouchEvent(event); 
  14. return false
  15. }; 
Fragment實現
Fragment的實現方式和Activity的實現方式基本相同,所需要注意的是要重寫onCreateView方法。主要的內容是將Activity的onCreate方法中的內容寫到Fragment的onCrateView方法中。例如SettingActivity中的onCrate方法如下:

 

  1. protected void onCreate(Bundle savedInstanceState) { 
  2. super.onCreate(savedInstanceState); 
  3. setContentView(R.layout.setting); 
  4. getView(); 
  5. setListener(); 
對應的Fragment中的onCrateView方法爲:

 

  1. public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  2. Bundle savedInstanceState) { 
  3. Utils.log("onCreateView"); 
  4. View v = inflater.inflate(R.layout.setting, container, false); 
  5. getViews(v); 
  6. setListener(); 
  7. return v; 
注意點
ViewPager與底部工具欄同步
Viewpager改變通知底部工具欄索引改變:
viewPager.setOnPageChangeListener(pageChangeListener);然後再onPageSelected方法中處理
底部工具欄索引發生改變通知ViewPager切換頁面
viewPager.setCurrentItem(i);
與Gallery衝突解決
爲ViewPager註冊Touch事件

 

  1. private OnTouchListener touchListener = new OnTouchListener(){ 
  2. @Override 
  3. public boolean onTouch(View v, MotionEvent event) { 
  4. if (currentIndex != 0) { 
  5. return false
  6. int[] location = new int[2]; 
  7. homeFragment.gallery.getLocationOnScreen(location); 
  8. if (location[0] != 0) { 
  9. return false
  10. if (event.getRawY() > location[1
  11. && event.getRawY() - location[1] < homeFragment.gallery 
  12. .getHeight()) { 
  13. return homeFragment.gallery.dispatchTouchEvent(event); 
  14. return false
  15. }; 
默認情況下ViewPager內的Gallery拖動時沒有效果,可以參考android的事件傳遞模型,這裏是在touch的時候指定某一區域的事件傳遞到Gallery中去,算是一個補丁吧。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章