展会信息港展会大全

Android中ViewPager使用FragmentPagerAdapter(底部圆点)
来源:互联网   发布日期:2015-10-02 16:15:04   浏览:1923次  

导读:最常用的是 FragmentPagerAdapter, FragmentStatePagerAdapter,FragmentPagerAdapter, and FragmentStatePagerAdapter 这几种适配器,分别在API 4+ Support 和API 13+ Support 上提供。效果图如下:使 ...

最常用的是 FragmentPagerAdapter, FragmentStatePagerAdapter,FragmentPagerAdapter, and FragmentStatePagerAdapter 这几种适配器,分别在API 4+ Support 和API 13+ Support 上提供。效果图如下:

使用Fragment 来表示一页,显得更加简单和直观,Fragment 本身提供的一些特性可以让我们方便的对每一页进行管理,使用FragmentManager可以根据ID或TAG来查找Fragment , 动态添加、删除、替换,Fragment 可以管理自己的生命周期,像Activity一样提供了一些生命周期回调方法。

让Fragment 成为ViewPager的一页时,FragmentManager会一直保存管理创建好了的Fragment,即使当前不是显示的这一 页,Fragment对象也不会被销毁,在后台默默等待重新显示。但如果Fragment不再可见时,它的视图层次会被销毁掉,下次显示时视图会重新创 建。

出于使用FragmentPagerAdapter 时,Fragment对象会一直存留在内存中,所以当有大量的显示页时,就不适合用FragmentPagerAdapter 了,FragmentPagerAdapter 适用于只有少数的page情况,像选项卡。这个时候你可以考虑使用FragmentStatePagerAdapter ,当使用FragmentStatePagerAdapter 时,如果Fragment不显示,那么Fragment对象会被销毁,但在回调onDestroy()方法之前会回调 onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来,FragmentStatePagerAdapter 比较适合页面比较多的情况,像一个页面的ListView

最后一点要注意,当使用FragmentPagerAdapter 时一定要为它的宿主ViewPager设置一个有效的ID !

下面是一个使用FragmentPagerAdapter 的示例,需要注意的是destroyItem()方法并不是去Destroy Fragment对象 而是Destroy的是Fragment的视图 , 这一点需要理解注意了

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

class MyFragmentPagerAdapter extends FragmentPagerAdapter{

public MyFragmentPagerAdapter(FragmentManager fm) {

super(fm);

}

@Override

public Fragment getItem(int position) {

return MyPageFragment.create(position);

}

@Override

public int getCount() {

return mPagerNum; // 代表页数

}

@Override

public void destroyItem(ViewGroup container, int position, Object object) {

// 这里Destroy的是Fragment的视图层次,并不是Destroy Fragment对象

super.destroyItem(container, position, object);

Log.i("INFO", "Destroy Item...");

}

}

下面是一个Fragment的示例程序,记得前面说过,使用FragmentPagerAdapter 适配器时,创建好了的Fragment会一直在内存中,不会被销毁,但它的视图层次是会被销毁的,所以onCreate()方法只会被调用一次,而 onCreateView() 方法,每次Fragment从不可见到可见时会被调用,可以看到Fragment有一些生命周期回调方法 onPause()、onDestroy()等等

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

public class MyPageFragment extends Fragment {

public static final String ARG_PAGE = "page_num";

// 当前页

private int currentPageNum;

public MyPageFragment() {

}

public static MyPageFragment create(int pagerNum) {

MyPageFragment myPageFrament = new MyPageFragment();

Bundle arg = new Bundle();

arg.putInt(ARG_PAGE, pagerNum);

myPageFrament.setArguments(arg);

return myPageFrament;

}

/* (non-Javadoc)

* @see android.support.v4.app.Fragment#onCreate(android.os.Bundle)

*

* Fragment创建的时候调用

*

*/

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Log.i("INFO", "onCreate..");

currentPageNum = getArguments().getInt(ARG_PAGE);

}

/* (non-Javadoc)

* @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)

*

* Fragment从不可见到可见时调用

*

*/

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

Log.i("INFO", "onCreateView..");

ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.per_pager1,

container, false);

switch (currentPageNum) {

case 0:

rootView.setBackgroundResource(R.drawable.page1_bg);

break;

case 1:

rootView.setBackgroundResource(R.drawable.page2_bg);

break;

case 2:

rootView.setBackgroundResource(R.drawable.page3_bg);

break;

default:

break;

}

return rootView;

}

@Override

public void onPause() {

super.onPause();

}

@Override

public void onDestroy() {

super.onDestroy();

Log.i("INFO", "MyFragment Destroy...");

}

}

ViewPager的使用跟上一篇介绍的是一样的,这里就不介绍 了,FragmentPagerAdapter的使用也挺简单的,关键是要明白它的含义和使用场景~

赞助本站

人工智能实验室

相关热词: ViewPager Android

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港