【移动开发】Android中Fragment+ViewPager的配合使用

简介:

原本在上一篇博客中要讲解一个Fragment的综合应用,但是中间又想到了滑屏方式,所以就分类在总结了一下j_0064.gif,(http://smallwoniu.blog.51cto.com/3911954/1308959)今天我将继续总结,关于Fragment+ViewPager的使用!


官方文档:http://developer.android.com/reference/android/support/v4/view/ViewPager.html

ViewPager is most often used in conjunction with Fragment, which is a convenient way to supply and manage the lifecycle of each page. There are standard adapters implemented for using fragments with the ViewPager, which cover the most common use cases. These are FragmentPagerAdapter andFragmentStatePagerAdapter; each of these classes have simple code showing how to build a full user interface with them.


这里大家可以回忆一下如果像上篇中介绍ViewPager的使用,叶片填充数据是Layout,页面少的话还可以,如果页面过多的话,全部加载到手机内存中,可能会耗尽内存,手动销毁又太麻烦。官方推荐 ViewPager与Fragment一起使用,可以更加方便的管理每个Page的生命周期,这里有标准的适配器实现用于ViewPager和Fragment,涵盖最常见的用例。FragmentPagerAdapterFragmentStatePagerAdapter这两个类都有简单的代码显示如何构建一个完整的用户界面与他们。


适配器类:

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
package  com.zhf.android_viewpager_fragment;
import  android.support.v4.app.Fragment;
import  android.support.v4.app.FragmentManager;
import  android.support.v4.app.FragmentPagerAdapter;
/**
  * 自定义fragment适配器
  * @author ZHF
  *
  */
public  class  MyFragmentPageAdapter  extends  FragmentPagerAdapter {
     public  MyFragmentPageAdapter(FragmentManager fm) {
         super (fm);
     }
     @Override
     public  int  getCount() {
         return  3 ;
     }
     @Override
     public  Fragment getItem( int  position) {
         switch  (position) {
          case  0 :
                 return  MyFragment.newInstance(position);
             case  1 :
                 return  MyFragment.newInstance(position);
             case  2 :
                 return  MyFragment.newInstance(position);
             default :
                 return  null ;
             }
     }
}


MyFragment类:

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
package  com.zhf.android_viewpager_fragment;
import  android.os.Bundle;
import  android.support.v4.app.Fragment;
import  android.view.LayoutInflater;
import  android.view.View;
import  android.view.ViewGroup;
import  android.widget.TextView;
/**
  * 用于创建Fragment对象,作为ViewPager的叶片
  * @author ZHF
  *
  */
public  class  MyFragment  extends  Fragment {
                                                                                                                                                                                                                                                                                                                  
     int  mNum;  //页号
     public  static  MyFragment newInstance( int  num) {
         MyFragment fragment =  new  MyFragment();
         // Supply num input as an argument.
         Bundle args =  new  Bundle();
         args.putInt( "num" , num);
         fragment.setArguments(args);
         return  fragment;
     }
     @Override
     public  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         //这里我只是简单的用num区别标签,其实具体应用中可以使用真实的fragment对象来作为叶片
         mNum = getArguments() !=  null  ? getArguments().getInt( "num" ) :  1 ;
     }
     /**为Fragment加载布局时调用**/
     @Override
     public  View onCreateView(LayoutInflater inflater, ViewGroup container,
             Bundle savedInstanceState) {
                                                                                                                                                                                                                                                                                                                      
         View view = inflater.inflate(R.layout.fragment_pager_list,  null );
         TextView tv = (TextView) view.findViewById(R.id.text);
         tv.setText( "fragment+"  + mNum);
         return  view;
     }
}


布局文件:


activity_main.xml

1
2
3
4
5
6
7
8
9
10
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     xmlns:tools= "http://schemas.android.com/tools"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent"  >
                                                                                                                                                                                                                                                                                           
     <android.support.v4.view.ViewPager
         android:id= "@+id/viewpager"
         android:layout_width= "fill_parent"
         android:layout_height= "fill_parent"  />
</RelativeLayout>

fragment_pager_list.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android"
     android:layout_width= "match_parent"
     android:layout_height= "match_parent"
     android:background= "@android:drawable/gallery_thumb"
     android:orientation= "vertical"  >
     <TextView
         android:id= "@+id/text"
         android:layout_width= "match_parent"
         android:layout_height= "wrap_content"
         android:gravity= "center_vertical|center_horizontal"
         android:text= "@string/hello_world"
         android:textAppearance= "?android:attr/textAppearanceMedium"  />
</LinearLayout>


MainActivity类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package  com.zhf.android_viewpager_fragment;
import  android.os.Bundle;
import  android.support.v4.app.FragmentActivity;
import  android.support.v4.app.FragmentManager;
import  android.support.v4.view.ViewPager;
public  class  MainActivity  extends  FragmentActivity {
     private  ViewPager mViewPager;
     private  MyFragmentPageAdapter mAdapter;
     @Override
     protected  void  onCreate(Bundle savedInstanceState) {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         mViewPager = (ViewPager) findViewById(R.id.viewpager);
                                                                                                                                                                                                                                 
         //这里因为是3.0一下版本,所以需继承FragmentActivity,通过getSupportFragmentManager()获取FragmentManager
         //3.0及其以上版本,只需继承Activity,通过getFragmentManager获取事物
         FragmentManager fm = getSupportFragmentManager();
         //初始化自定义适配器
         mAdapter =   new  MyFragmentPageAdapter(fm);
         //绑定自定义适配器
         mViewPager.setAdapter(mAdapter);
     }
}


效果图:

162219805.png

效果与ViewPager中添加View的效果是一样的!但是它与View的区别在于它有自己的生命周期,可以随时更改自己的状态便于管理。


事实上使用FragmentPagerAdapter 时,Fragment对象会一直存留在内存中,所以当有大量的显示页时,就不适合用FragmentPagerAdapter了,FragmentPagerAdapter 适用于只有少数的page情况,像选项卡

这个时候你可以考虑使用FragmentStatePagerAdapter ,当使用FragmentStatePagerAdapter 时,如果Fragment不显示,那么Fragment对象会被销毁,(滑过后会保存当前界面,以及下一个界面和上一个界面(如果有),最多保存3个,其他会被销毁掉
但在回调onDestroy()方法之前会回调onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来,
FragmentStatePagerAdapter
 比较适合页面比较多的情况,像一个页面的ListView 。



     本文转自zhf651555765 51CTO博客,原文链接:http://blog.51cto.com/smallwoniu/1322746,如需转载请自行联系原作者




相关文章
|
Java Linux Android开发
移动应用开发与操作系统的交互:深入理解Android和iOS
在数字时代,移动应用成为我们日常生活的一部分。本文将深入探讨移动应用开发的核心概念、移动操作系统的工作原理以及它们如何相互作用。我们将通过实际代码示例,展示如何在Android和iOS平台上创建一个简单的“Hello World”应用,并解释其背后的技术原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
224 3
|
12月前
|
Android开发 开发者 容器
android FragmentManager 删除所有Fragment 重建
通过本文,我们详细介绍了如何使用 `FragmentManager`删除所有Fragment并重建。通过理解和应用这些步骤,可以在实际开发中更灵活地管理Fragment,满足各种应用场景的需求。希望本文能帮助开发者更好地掌握Fragment管理技巧,提高应用开发效率和代码质量。
243 8
|
缓存 算法 网络协议
Android面试回忆录移动应用开发专业核心课程
Android面试回忆录移动应用开发专业核心课程
|
IDE 开发工具 Android开发
移动应用开发之旅:探索Android和iOS平台
在这篇文章中,我们将深入探讨移动应用开发的两个主要平台——Android和iOS。我们将了解它们的操作系统、开发环境和工具,并通过代码示例展示如何在这两个平台上创建一个简单的“Hello World”应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧,帮助你更好地理解和掌握移动应用开发。
331 17
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
291 3
|
设计模式 前端开发 JavaScript
探索移动应用开发:从Android到iOS的跨平台之旅
【9月更文挑战第21天】在这篇文章中,我们将一同揭开移动应用开发的神秘面纱,从Android和iOS这两个主流平台出发,探讨如何利用现代技术栈实现跨平台开发。文章将通过具体的代码示例,带领读者理解不同平台间的差异与联系,以及如何运用React Native框架简化开发流程,实现一次编写,多平台运行的目标。无论你是刚入门的新手还是希望拓展技能的老手,这篇文章都将为你提供宝贵的知识和启示。
249 3
|
存储 Java 开发工具
移动应用开发之旅:探索Android操作系统的无限可能
【8月更文挑战第56天】随着智能手机的普及,移动应用已成为我们日常生活中不可或缺的一部分。本文将引导读者了解移动应用开发的基本概念,重点探讨Android操作系统的开发环境搭建、界面设计、功能实现以及与后端服务的交互。通过简单的代码示例和清晰的步骤说明,即便是初学者也能快速入门,开启自己的移动应用开发之旅。
|
机器学习/深度学习 Android开发 iOS开发
探索移动应用开发的未来:Android与iOS的较量
【8月更文挑战第21天】在数字时代的浪潮中,移动应用已成为日常生活不可或缺的一部分。两大主流平台,Android和iOS,各自以其独特的优势和挑战塑造着开发者和用户的世界。本文将深入探讨这两个平台的发展动态、设计理念及其对移动应用开发未来的影响。
|
Android开发
Android使用ViewPager做无限轮播,人为滑动时停止
Android使用ViewPager做无限轮播,人为滑动时停止
251 2

热门文章

最新文章