ViewPage配合FragmentPagerAdapter
2016-05-18 09:55
573 查看
http://blog.sina.com.cn/s/blog_881875e70101m648.html
先说一段题外话。我们在进行android开发的时候发现,activity是与界面相关的,view及其派生类也是与界面相关的,fragment也是与界面相关的,那他们直接的联系和区别在哪呢。我们知道activity并不直接生成界面,他与view及其派生类关联才能产生界面,acitivity有自己的生命周期,掌管着界面从创建到消亡的过程,用户对应用程序的操作(比如按键,触屏)都要通过acitivity来分发和处理,activity建立view与监听器及之间的关联,从activity的这些作用来看与mvc架构中的c(Controller)作用相似,而view及其派生类当然就是mvc架构中的v。
我们再来看fragment,fragment有自己的生命周期(虽然它的生命周期依赖activity的生命周期),它能够管理属于它自己的view,他有自己的用户交互,这么看它也像是一个mvc中的c,但是它又可以像view一样加入到acitivity的布局中,这又像是一个mvc架构中的v。因此fragment是为了简化actvity与view之间的交互而将activity对用户交互的逻辑模块化进行的封装,它的好处是:1>简化activity的逻辑控制 2>这些模块化的fragment也更利于复用。
Fragment有如下特点:
1>Fragment表现为一个activity用户界面的一部分
2>一个activity可以有多个fragment
3>可以在多个activity中复用fragment
4>fragment有自己的生命周期
5>fragment有自己的事件处理
6>activity运行中,可以添加,移除一个fragment
7>fragment的生命周期有其宿主activity控制
回到正题,ViewPager配合FragmentPagerAdapter如何使用,我们通过下面的例子来说明。
界面布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</android.support.v4.view.ViewPager>
</LinearLayout>
界面实现:
public class PagerAdapterAndActionBarActivity extends Activity {
ViewPager viewPager;
ActionBar mActionBar;
Fragment1 fragment1;
Fragment2 fragment2;
ArrayList<Fragment> listFragmentsa;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.block_incoming_call_setting);
// 设置viewPager的适配器
listFragmentsa = new ArrayList<Fragment>();
fragment1 = new Fragment1();
fragment2 = new Fragment2();
listFragmentsa.add(fragment1);
listFragmentsa.add(fragment2);
MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getFragmentManager(), listFragmentsa);
viewPager = (ViewPager) findViewById(R.id.viewpager1);
viewPager.setAdapter(myFragmentPagerAdapter);
viewPager.setCurrentItem(0);
// 监听viewPager的变化,ViewPager的变化会同步到ActionBar的tab页
MyOnPageChangeListener myOnPageChangeListener = new MyOnPageChangeListener();
viewPager.setOnPageChangeListener(myOnPageChangeListener);
// 设置ActionBar的tab页,并且ViewPager会随着Tab的选择变化
mActionBar = getActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
MyTabListener myTabListener = new MyTabListener(listFragmentsa);
Tab tab1 = mActionBar.newTab().setText("aaaaaaaa");
Tab tab2 = mActionBar.newTab().setText("bbbbbbbb");
tab1.setTabListener(myTabListener);
tab2.setTabListener(myTabListener);
mActionBar.addTab(tab1);
mActionBar.addTab(tab2);
}
class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> listFragments;
public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> al) {
super(fm);
listFragments = al;
}
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return listFragments.get(position);
}
@Override
public int getCount() {
return listFragments.size();
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
}
class MyTabListener implements TabListener {
ArrayList<Fragment> mFragments;
public MyTabListener(ArrayList<Fragment> mFragments) {
super();
this.mFragments = mFragments;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
}
class MyOnPageChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
Log.w("xujinqq", "onPageScrollStateChanged");
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
Log.w("xujinqq", "onPageScrolled");
}
@Override
public void onPageSelected(int arg0) {
Log.w("xujinqq", "onPageSelected" + arg0);
// mActionBar.getTabAt(arg0).select();
mActionBar.setSelectedNavigationItem(arg0);
}
}
}
先说一段题外话。我们在进行android开发的时候发现,activity是与界面相关的,view及其派生类也是与界面相关的,fragment也是与界面相关的,那他们直接的联系和区别在哪呢。我们知道activity并不直接生成界面,他与view及其派生类关联才能产生界面,acitivity有自己的生命周期,掌管着界面从创建到消亡的过程,用户对应用程序的操作(比如按键,触屏)都要通过acitivity来分发和处理,activity建立view与监听器及之间的关联,从activity的这些作用来看与mvc架构中的c(Controller)作用相似,而view及其派生类当然就是mvc架构中的v。
我们再来看fragment,fragment有自己的生命周期(虽然它的生命周期依赖activity的生命周期),它能够管理属于它自己的view,他有自己的用户交互,这么看它也像是一个mvc中的c,但是它又可以像view一样加入到acitivity的布局中,这又像是一个mvc架构中的v。因此fragment是为了简化actvity与view之间的交互而将activity对用户交互的逻辑模块化进行的封装,它的好处是:1>简化activity的逻辑控制 2>这些模块化的fragment也更利于复用。
Fragment有如下特点:
1>Fragment表现为一个activity用户界面的一部分
2>一个activity可以有多个fragment
3>可以在多个activity中复用fragment
4>fragment有自己的生命周期
5>fragment有自己的事件处理
6>activity运行中,可以添加,移除一个fragment
7>fragment的生命周期有其宿主activity控制
回到正题,ViewPager配合FragmentPagerAdapter如何使用,我们通过下面的例子来说明。
界面布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewpager1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</android.support.v4.view.ViewPager>
</LinearLayout>
界面实现:
public class PagerAdapterAndActionBarActivity extends Activity {
ViewPager viewPager;
ActionBar mActionBar;
Fragment1 fragment1;
Fragment2 fragment2;
ArrayList<Fragment> listFragmentsa;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.block_incoming_call_setting);
// 设置viewPager的适配器
listFragmentsa = new ArrayList<Fragment>();
fragment1 = new Fragment1();
fragment2 = new Fragment2();
listFragmentsa.add(fragment1);
listFragmentsa.add(fragment2);
MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getFragmentManager(), listFragmentsa);
viewPager = (ViewPager) findViewById(R.id.viewpager1);
viewPager.setAdapter(myFragmentPagerAdapter);
viewPager.setCurrentItem(0);
// 监听viewPager的变化,ViewPager的变化会同步到ActionBar的tab页
MyOnPageChangeListener myOnPageChangeListener = new MyOnPageChangeListener();
viewPager.setOnPageChangeListener(myOnPageChangeListener);
// 设置ActionBar的tab页,并且ViewPager会随着Tab的选择变化
mActionBar = getActionBar();
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
MyTabListener myTabListener = new MyTabListener(listFragmentsa);
Tab tab1 = mActionBar.newTab().setText("aaaaaaaa");
Tab tab2 = mActionBar.newTab().setText("bbbbbbbb");
tab1.setTabListener(myTabListener);
tab2.setTabListener(myTabListener);
mActionBar.addTab(tab1);
mActionBar.addTab(tab2);
}
class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private ArrayList<Fragment> listFragments;
public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> al) {
super(fm);
listFragments = al;
}
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return listFragments.get(position);
}
@Override
public int getCount() {
return listFragments.size();
}
@Override
public int getItemPosition(Object object) {
return super.getItemPosition(object);
}
}
class MyTabListener implements TabListener {
ArrayList<Fragment> mFragments;
public MyTabListener(ArrayList<Fragment> mFragments) {
super();
this.mFragments = mFragments;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
}
class MyOnPageChangeListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {
Log.w("xujinqq", "onPageScrollStateChanged");
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
Log.w("xujinqq", "onPageScrolled");
}
@Override
public void onPageSelected(int arg0) {
Log.w("xujinqq", "onPageSelected" + arg0);
// mActionBar.getTabAt(arg0).select();
mActionBar.setSelectedNavigationItem(arg0);
}
}
}
相关文章推荐
- 从FTP服务器读取文件到本地
- 每天laravel-20160809| Container -12
- 每天laravel-20160809| Container -12
- PHP正则表达式入门教程(推荐)
- laravel 学习笔记 —— 神奇的服务容器
- laravel 学习笔记——视图
- laravel 学习笔记——请求与响应
- laravel 学习笔记——路由(路由与控制器)
- laravel 学习笔记——路由(中间件与路由组)
- 系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
- laravel 学习笔记——路由(基础)
- [转]系统吞吐量(TPS)、用户并发量、性能测试概念和公式---学习
- php常用函数集
- PHP 单链表
- PHP 堆栈和队列
- laravel 学习笔记——起点
- mysql的常用语句,php使用
- ThinkPHP关联模型操作
- yii2批量添加的问题
- 实现FTP的文件上传与下载