Android ViewPager组件

一、以代码的方式定义并产生布局

  在界面构建过程中,会大量的使用XML文件,定义视图布局。下面尝试使用以代码的方式定义视图层级结构。使用代码方式定义视图,其实就是调用视图的构造方法。但是,在一些构建块中,依然要使用资源ID,ViewPager就是这样的一种构建块。而FragmentManager要求任何作Fragment容器的视图都必须具有资源ID。Viewpager是一个Fragment容器。

  以代码方式创建视图,应完成以下任务项:

  • 为ViewPager创建资源ID。
  • 创建ViewPager实例并赋值给ViewPager。
  • 赋值资源ID给ViewPager,并对其进行配置。
  • 设备ViewPager为Activity的内容视图。

1. 独立的资源ID

  在res/values目录下创建名为ids.xml文件,用于存储资源ID。(ids.xml)

1 <?xml version="1.0" encoding="utf-8"?>
2 <resources>
3     <item type="id" name="viewPager" />
4 </resources>

2. 以代码方式创建内容视图(CrimeViewPager.java)

1 // 实例化ViewPager
2 mViewPager = new ViewPager(this);
3 // 为ViewPager实例配置资源ID
4 mViewPager.setId(R.id.viewPager);
5 // 设置为Activity的容器
6 setContentView(mViewPager);

3. ViewPager与PagerAdapter (视图显示数据的数据源)

 1 public class CrimePagerActivity extends SingleFragmentActivity
 2 {
 3     private ViewPager mViewPager;
 4     private ArrayList<Crime> mCrimes;
 5 
 6     public CrimePagerActivity()
 7     {
 8     }
 9 
10     @Override
11     public Fragment createFragment()
12     {
13         return null;
14     }
15 
16     @Override
17     public void onCreate(Bundle savedInstanceState)
18     {
19         super.onCreate(savedInstanceState);
20 
21         // 实例化ViewPager
22         mViewPager = new ViewPager(this);
23         // 为ViewPager实例配置资源ID
24         mViewPager.setId(R.id.viewPager);
25         // 设置为Activity的容器
26         setContentView(mViewPager);
27 
28         mCrimes = CrimeLab.get(this).getCrimes();
29 
30         // fragment manager
31         FragmentManager fm = getSupportFragmentManager();
32         mViewPager.setAdapter(new FragmentStatePagerAdapter(fm)
33         {
34             // 获取当前视图的Fragment对象
35             @Override
36             public Fragment getItem(int position)
37             {
38                 Crime crime = mCrimes.get(position);
39                 return CrimeFragment.newInstance(crime.getmId());
40             }
41 
42             // 获取数据条数,计算显示视图个数
43             @Override
44             public int getCount()
45             {
46                 return mCrimes.size();
47             }
48         });
49 
50         // 设置从列表进入详细界面的具体数据
51         for (int idx = 0; idx < mCrimes.size(); idx++)
52         {
53             UUID code = (UUID) getIntent().getSerializableExtra(CrimeFragment.sExtra_Crime_ID);
54             if (mCrimes.get(idx).getmId().equals(code))
55             {
56                 // 设置界面当前显示的View
57                 mViewPager.setCurrentItem(idx);
58                 break;
59             }
60         }
61     }
62 }

PS:可以通过方法设置当前页面预加载相邻页面数目:

1 // 定制预加载相邻页面的数目
2 mViewPager.setOffscreenPageLimit(3);

4. 通过方法监听界面间的切换

 1 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
 2         {
 3             @Override
 4             public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
 5             {
 6 
 7             }
 8 
 9             @Override
10             public void onPageSelected(int position)
11             {
12                 Crime crime = mCrimes.get(position);
13                 if (null != crime.getmTitle())
14                 {
15                     setTitle(crime.getmTitle());
16                 }
17             }
18 
19             @Override
20             public void onPageScrollStateChanged(int state)
21             {
22 
23             }
24         });

 

posted @ 2017-05-07 14:55  naray  阅读(707)  评论(0编辑  收藏  举报