首页 > 代码库 > Android ViewPager组件

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 // 实例化ViewPager2 mViewPager = new ViewPager(this);3 // 为ViewPager实例配置资源ID4 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     @Override11     public Fragment createFragment()12     {13         return null;14     }15 16     @Override17     public void onCreate(Bundle savedInstanceState)18     {19         super.onCreate(savedInstanceState);20 21         // 实例化ViewPager22         mViewPager = new ViewPager(this);23         // 为ViewPager实例配置资源ID24         mViewPager.setId(R.id.viewPager);25         // 设置为Activity的容器26         setContentView(mViewPager);27 28         mCrimes = CrimeLab.get(this).getCrimes();29 30         // fragment manager31         FragmentManager fm = getSupportFragmentManager();32         mViewPager.setAdapter(new FragmentStatePagerAdapter(fm)33         {34             // 获取当前视图的Fragment对象35             @Override36             public Fragment getItem(int position)37             {38                 Crime crime = mCrimes.get(position);39                 return CrimeFragment.newInstance(crime.getmId());40             }41 42             // 获取数据条数,计算显示视图个数43             @Override44             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                 // 设置界面当前显示的View57                 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             @Override10             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             @Override20             public void onPageScrollStateChanged(int state)21             {22 23             }24         });

 

Android ViewPager组件