Fragment与ViewPager

众所周知,为了实现滑动界面,经常让Fragment与ViewPager一起结合使用,每一个ViewPager的页面就是一个Fragment,我们可以在fragment中实现丰富的功能。
它的基本用法可以是下面这样

1、创建一个或者多个你需要的Fragment类,其实就是类似activity一样,也有OnCreate()等回调函数。fragmentsList = new ArrayList<Fragment>();
Fragment a = new aFragment();
Fragment b = new bFragment();
Fragment c= new cFragment();

fragmentsList.add(a);
fragmentsList.add(b);
fragmentsList.add(c);

mPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentsList));
mPager.setCurrentItem(0);
mPager.setOnPageChangeListener(new MyOnPageChangeListener());
mPager.setOffscreenPageLimit(3);      // 同时加载3个fragment 

它的适配器:

import java.util.ArrayList;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class MyFragmentPagerAdapter extends FragmentPagerAdapter {//这里继承的是FragmentPagerAdapter
    private ArrayList<Fragment> fragmentsList;

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    public MyFragmentPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) {
        super(fm);
        this.fragmentsList = fragments;
    }

    @Override
    public int getCount() {
        return fragmentsList.size();
    }

    @Override
    public Fragment getItem(int arg0) {
        return fragmentsList.get(arg0);
    }

    @Override
    public int getItemPosition(Object object) {
        return super.getItemPosition(object);
    }

}

上面的适配器继承的是FragmentPagerAdapter,除此之外还可以继承FragmentStatePagerAdapter,但是两者是有区别的。
1.FragmentPagerAdapter继承自PagerAdapter ,主要用来展示多个Fragment页面,并且每一个Fragment都会被保存在fragment manager中,最适用于那种少量且相对静态的页面,用户访问过的fragment都会被保存在内存中,尽管他的视图层级可能会在不可见时被销毁。
    

2.FragmentStatePagerAdapter继承自PagerAdapter,主要使用Fragment来管理每个页面。这个类同样用来保存和恢复fragment页面的状态,更多用于大量页面,例如视图列表。当某个页面对用户不再可见时,他们的整个fragment就会被销毁,仅保留fragment状态。相比于FragmentPagerAdapter,这样做的好处是在访问各个页面时能节约大量的内存开销,但代价是在页面切换时会增加非常多的开销。

 

他们之间最大的不同在于:用户访问过的页面不可见之后是否会保留在内处于存中。

我们都知道:ViewPager为了保证滑动的流畅性,viewpager在加载当前页的时候已经将pager页左右页的内容加载进内存里了(预加载机制)。当滑动到第n页的时候,adapter会为相邻两页创建Fragment实例。FragmentPagerAdapter和FragmentStatePagerAdapter在这一点是一样的。

但是对于上上页:

FragmentPagerAdapter的做法:上上页实例保留,但是摧毁它的视图。

FragmentStatePagerAdapter的做法:果断摧毁上上页的实例(我不留情)。

注意:adapter的getItem()方法是当fragment不存在的时候才被调用,返回的是Fragment的实例。因此对于FragmentPagerAdapter,当每页的Fragment被创建后,这个函数就不会被调到了。而对于FragmentStatePagerAdapter则不然。

卸载不再需要的fragment

1.FragmentStatePagerAdapter:选择用remove(Fragment)方法将fragment从activity的FragmentManager中彻底移除,在销毁 fragment时,它会将 其 onSaveInstanceState(Bundle) 方法中的Bundle信息保存下来。用户切换回原来的页面后,保存的实例状  态可用于恢复生成新的fragment.

2. FragmentPagerAdapter:选择调用事务的detach(Fragment) 方法,FragmentPagerAdapter只是销毁了fragment的视 图,但仍将 fragment实例保留在FragmentManager中。因此, FragmentPagerAdapter创建的fragment永远不会被销毁。

警戒区:
1.ViewPager.getChildCount() 返回的是当前ViewPager所管理的没有被销毁视图的Fragment,并不是所有的Fragment。想要获取所有的Fragment数量,应该调用ViewPager.getAdapter().getCount().

2.主Activity要继承FragmentActivity,只有FragmentActivity内部才能内嵌Fragment普通Activity是不行的。

3.activity和Fragment都要用android.support.v4.app.Fragment,否则可能出现无法将Fragment的子类转换为Fragment的情况,会抛出转换异常。

时间: 2024-10-13 23:31:01

Fragment与ViewPager的相关文章

Fragment和ViewPager的使用和比较

Fragment是一种可以嵌入在活动当中的UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛.拥有自己的生命周期和接收.处理用户的事件.你可以动态的添加.替换和移除某个Fragment. Fragment使用非常广泛,在此不介绍Fragment的生命周期,本例子将使用Fragment实现如下效果: Message   Friend   Setting 图一 Message   Friend   Setting 图二 Message   Friend   Setti

Android流行界面结构——Fragment通过ViewPager(带指示器)嵌套Fragment结构的创建方法详解

原创文章,转载请注明出处http://www.cnblogs.com/baipengzhan/p/6287213.html 当前Android流行界面结构的一种--Fragment通过ViewPager嵌套Fragment结构目前非常常用,在本篇文章中, 我们一步一步将其创建出来,非常详细的让大家看到这个界面是如何实现的,下面我们开始吧. 首先我们看一下最终的效果动画,以便大家有个最初的印象. 本文章专注于功能的实现,并没有着重于界面的美观,所以大家看到的效果一般,UI效果需要大家进一步修改.

Android中Fragment和ViewPager那点事儿

在之前的博文<Android中使用ViewPager实现屏幕页面切换和引导页效果实现>和<Android中Fragment的两种创建方式>以及<Android中Fragment与Activity之间的交互(两种实现方式)>中我们介绍了ViewPager以及Fragment各自的使用场景以及不同的实现方式. 那如果将他们两结合起来,会不会擦出点火花呢,答案是肯定的.之前在介绍ViewPager时,我们实现了多个ImageView的切换,并配合更新导航原点的状态.那我们现在

【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

ViewPager中切换界面Fragment被销毁的问题分析 1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3 2.Fragment生命周期以及与Activity生命周期对比                    3.问题描述 按上图所说,只有当Fragment所Attached的Activity执行destroy的时候才会调用onDestoryView方法,然而现实是: 当界面由2切换到1的时候,3界面对应的Fragment实际上走了如下流程: 1 -->onP

Android Tab类型主界面 Fragment+TabPageIndicator+ViewPager

文章地址: Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager 1.使用ViewPager + PagerAdapter 每个页面的内容都在一个Activity中,维护起来会比较麻烦 2.FragmentManager + Fragment 每个页面的内容分开,但是只能点击按钮换页 3.ViewPager + FragmentPagerAdapter 综合前两种方式,比较好 4.TabPageIndicator + ViewPager

Replace Fragment in ViewPager (ViewPager里替换Fragment)

其实方法很简单,只是一开始想复杂了,然后去StackOverflow上看到的各种答案就更迷糊了. 主要思维偏了就完了. ViewPager里放的不管是Fragment还是Layout,这都是个Adapter容器.因此你要更改里面的东西,最正确的方法就是去修改Adapter里的数据. 替换步骤需要: 1. 删除FragmentManager现有的当前页面的Fragment. 我用的是mFm.beginTransaction().remove(mFm.findFragmentByTag("andro

android fragment+ FragmentTabHost+viewpager 切换状态不保存的问题

转载请注明出处:http://blog.csdn.net/djy1992/article/details/46674169 @author dujinyang 难得有时间上来写博客. fragment虽然好用,但个人还是觉得有利有弊. 网上大都说切换状态,有挺多问题, 有很多种解决方案. 第一种常常遇到的情况: if(rootView == null) rootView = inflater.inflate(R.layout.fragment_home, container,false); Vi

Fragment利用ViewPager实现左右滑动--第三方开源--SlidingTabLayout和SlidingTabStrip实现

MainActivity: 1 package com.zzw.fragmentteb; 2 3 import java.util.ArrayList; 4 5 import android.graphics.Color; 6 import android.os.Bundle; 7 import android.support.v4.app.Fragment; 8 import android.support.v4.app.FragmentActivity; 9 import android.s

Fragment嵌套ViewPager切换后数据消失ViewPager空白问题

先描述一下现象 如图 解决后如图 之前先在网上找了很多的解决办法,有的网友说要继承FragmentStatePagerAdapter替换掉FragmentPagerAdapter我试了试没管用.后来在解决如下 此方法为初始化ViewPager private void init() { fragmentsList = new ArrayList(); manager = getFragmentManager(); fragmentsList = new ArrayList<Fragment>(