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 });