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

ViewPager中切换界面Fragment被销毁的问题分析

1、使用场景

ViewPager+Fragment实现界面切换,界面数量>=3

2、Fragment生命周期以及与Activity生命周期对比

                  

3、问题描述

按上图所说,只有当Fragment所Attached的Activity执行destroy的时候才会调用onDestoryView方法,然而现实是:

当界面由2切换到1的时候,3界面对应的Fragment实际上走了如下流程:

1 -->onPause
2 -->onStop
3 -->onDestroyView

再由1切换回2或者3时,3界面对应的Fragment的执行流程:

1 -->onCreateView
2 -->onStart
3 -->onResume

可见,界面3对应的Fragment被销毁并重新创建。

4、原因分析

ViewPager的默认加载方式是缓存当前界面前后相邻的两个界面,即最多共缓存包括当前界面在内的三个界面信息。当滑动切换界面的时候,非相邻界面信息将被释放。

界面2是当前界面,界面1和3是缓存界面,当切换到1时,界面2仍缓存,界面3被销毁释放,于是便有了onDestroyView的调用。

由1切换到2或3时,界面3又被重新创建,于是走了onCreateView流程。

5、解决方案

  • 方案一:设置ViewPager的缓存界面数

此方案适用于界面数较少的情况,避免缓存界面太多导致内存吃紧。

方法:

mPager .setOffscreenPageLimit(2);

参数:int limit    -    缓存当前界面每一侧的界面数

以上述为例,当前界面为1,limit = 2,表示缓存2、3两个界面。如此便避免了界面3被销毁。

  • 方案二:保存状态并恢复

此方案适用于可用界面信息可由状态保存和恢复实现的情况。

在onDestroyView方法内保存相关信息,在onCreateView方法内恢复信息设置。

  • 方案三(推荐):复用Fragment的RootView

此方案适用通用场景,推荐使用。

步骤1:在onDestroyView方法内把Fragment的RootView从ViewPager中remove

1 @Override
2 public void onDestroyView() {
3     LogUtils.d(TAG , "-->onDestroyView");
4     super .onDestroyView();
5     if (null != FragmentView) {
6         ((ViewGroup) mFragmentView.getParent()).removeView(mFragmentView);
7     }
8 }

步骤2:在onCreateView方法内复用RootView

 1 @Override
 2 public View onCreateView(LayoutInflater inflater, ViewGroup container,
 3         Bundle savedInstanceState) {
 4     LogUtils.d (TAG, "-->onCreateView");
 5     if (null == mFragmentView) {
 6          mFragmentView = inflater.inflate(R.layout.fragment, container, false);
 7          mListView = (ListView) mFragmentView .findViewById(R.id.mm_listview);
 8          mListView.setAdapter(mAdapter);
 9          mPbar = (ProgressBar) mFragmentView.findViewById(R.id.pbar_mm_loading);
10          mPbar.setVisibility(View.VISIBLE);
11     }
12
13     return mFragmentView ;
14 }

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

时间: 2024-08-05 07:08:08

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

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

ViewPager中切换界面Fragment被销毁的问题分析 原文链接 http://www.cnblogs.com/monodin/p/3866441.html 1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3 2.Fragment生命周期以及与Activity生命周期对比                    3.问题描述 按上图所说,只有当Fragment所Attached的Activity执行destroy的时候才会调用onDestoryView方法,然而现

ViewPager中切换界面Fragment被销毁的问题

ViewPager中切换界面Fragment被销毁的问题分析 使用ViewPager+Fragment实现界面切换,当界面数量大于3时,出现二次滑动后数据消失的情况,下面由Fragment生命周期进行分析 简单解析: 使用pager=3进行测试,当界面由2切换到1的时候,3界面对应的Fragment实际上走了如下流程: 1 -->onPause 2 -->onStop 3 -->onDestroyView 再由1切换回2或者3时,3界面对应的Fragment的执行流程: 1 -->

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

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

Android popwindow和fragment结合 左侧弹出下拉菜单 切换界面

延续上一篇文章Android 实现对话框圆角功能 ,在项目推进的过程当中,之前是已经用popwindow实现了点击按钮,在按钮下方弹出下拉菜单,实现了类似微信右上角加好友的功能,有兴趣的朋友,可以下载这个资源.回归主题,之前popwindow的使用,是固定在了登陆刚进去的界面,假设现在点击了左侧菜单的其他按钮,这就要求标题下方的内容必须更新所要显示的内容,一开始想都没想,就用了如下代码进行跳转: Intent intent = new Intent(Intent.ACTION_EDIT, nul

Android应用经典主界面框架之二:仿网易新闻客户端、CSDN 客户端 (Fragment ViewPager)

第二种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表,使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View,而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter只在这个包里有,在android.app.*这个包下面么

ViewPager+Fragment实现Tab主界面

毕竟是第一次做项目,所以在每一点上都做得特别认真,接下来我来给大家大致讲述一下用ViewPager+Fragment来实现app Tab主界面,突然想起来LZ居然2天没去上课了......(>....<) 没办法,为了暑假的实习offer,只好拼了!!! package com.bob.tabui; import android.support.v4.app.*; import android.os.Bundle; import android.support.v4.view.ViewPage

安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)

什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再重复. 什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个Activity中,我们可以合并多个Fragment在一个单独的activity中建立多个UI面板,或

转-Fragment+ViewPager组件(高仿微信界面)

http://www.cnblogs.com/lichenwei/p/3982302.html 什么是ViewPager? 关于ViewPager的介绍和使用,在之前我写过一篇相关的文章<安卓开发复习笔记——ViewPager组件(仿微信引导界面)>,不清楚的朋友可以看看,这里就不再重复. 什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个Act

fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .

fragment中嵌套viewpager,vierpager中有多个fragment,不显示 ... 现在好多应用流行一种布局.底部几个工具栏选项,上面也有类似tab的选项. 底部用RadioGroup控制fragment的切换.以上有五个fragment. 第一个fragment,代表着首页.首页又是一个类似tab的fragment,使用viewpager切换着两个fragment. private void InitViewPager(View parentView) {        mP