Android横屏下Fragment界面重叠问题
前言:
项目是基于平板开发的,设计的界面是要求横屏展示界面。所以我将所有的Activity都强制设置为横屏
android:screenOrientation="landscape"
-----------------------------------------------------------------------------------------------------
问题:
主界面,最常见的Activity+n个Fragment
我这里使用的hide、show Fragment的方式来切换Fragment,当关闭手机、平板屏幕再打开,会发现Fragment界面重叠
安卓开发_慕课网_Fragment实现Tab(App主界面)
-----------------------------------------------------------------------------------------------------
1、先通过界面来了解具体情况
界面左侧是4个Tab按钮,对应四个Fragment界面,如下面两个图 ,是正常的界面显示效果,这里我已经将这个Activity强制为横屏显示

2、正常情况下,我这个时候关闭了屏幕,然后在打开屏幕,可以看到 这个时候会显示 之前打开过的Fragment界面,导致界面重叠

此时,我们测试将activity横屏显示去掉,让他竖屏显示,然后在进行关屏幕,打开屏幕操作,会发现 在竖屏的情况下,并没有发生界面重叠的问题。
那么我们就可以猜出问题所在了:生命周期
3、接着我们给Activity的onCreate() onResume()方法 Fragment的onCreateView() onResume()方法打印Log
(1)看我们关闭屏幕的时候执行的生命方法

这里我们可以看到,当我们关闭屏幕的时候,很显然Activity又执行了一遍生命周期
(2)在看我们打开屏幕的时候执行的生命方法

可以看到,Activity又执行了一次onCreate()方法,而Fragment执行了多次onCreateView()
总结一下:锁屏关闭屏幕后,Activity会由横屏切换为竖屏,这个时候执行了onCreate()方法,但是Activity原来对应的Fragment并没有被销毁,(导致第一张生命周期图中 今日任务Fragment执行了两次onresume,因为新建了一个和原来未被销毁的一个,此时存在两个今日任务Fragment), 解屏打开屏幕后,Activity又有竖屏切换为横屏(我们强制设置的横屏显示),又执行了onCreate()方法,导致又创建了一次Fragment,但是原来的Fragment还是没有被销毁(所以第二章生命周期图中,我们可以看到此时存在了3个今日任务Fragement的onResume()方法)。那么最终就会导致打开屏幕后 之前所有未被销毁的Fragment都显示出来。
解决方法:
我们不让开关屏幕的时候Activity走生命周期,那么在清单文件中给Activity设置下面这两个属性即可
android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden|screenSize"
注意:4.0以上的configChanges需要添加screenSize属性,否则切换横竖屏仍会执行生命周期
Android横屏下Fragment界面重叠问题的更多相关文章
- Android 使用Fragment界面向下跳转并一级级返回
http://www.cnblogs.com/_ymw/p/4227862.html 1.首先贴上项目结构图: 2.先添加一个接口文件BackHandledInterface.java,定义一个set ...
- [转]Android 使用Fragment界面向下跳转并一级级返回
1.首先贴上项目结构图: 2.先添加一个接口文件BackHandledInterface.java,定义一个setSelectedFragment方法用于设置当前加载的Fragment在栈顶,主界 ...
- Android应用经典主界面框架之中的一个:仿QQ (使用Fragment, 附源代码)
备注:代码已传至https://github.com/yanzi1225627/FragmentProject_QQ 欢迎fork,如今来审视这份代码,非常多地方写的不太好,欢迎大家指正.有时间我会继 ...
- Android Fragment学习笔记(二)----Fragment界面添加和管理
Fragment界面添加 了解过fragment的生命周期等简单知识,于是去看官方文档来了解更多相关内容,要添加fragment到我们的UI界面中,给出了两种常用的方法,第一个是在activity的布 ...
- Android 自学之基本界面组件(下)
按钮(Button)与图片按钮(ImageButton)组件的功能和用法 Button继承了TextView,ImageButton继承了Button.不管是Button还是ImageButton,他 ...
- Android应用经典主界面框架之二:仿网易新闻client、CSDN client (Fragment ViewPager)
另外一种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表.使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View.而是Fragment.所 ...
- Android控件-Fragment+ViewPager(高仿微信界面)
什么是Fragment? Fragment是Android3.0后新增的概念,Fragment名为碎片,不过却和Activity十分相似,具有自己的生命周期,它是用来描述一些行为或一部分用户界面在一个 ...
- [Android] Android 手机下 仿 微信 客户端 界面 -- 微聊
Android 手机下 仿 微信 客户端 界面 -- 微聊 (包括聊天列表 + 聊天对话页 + 朋友圈列表页 + 我的/发现 列表页) 项目演示: 功能说明: 1)底部标签切换 (TabHost + ...
- Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml
Android开发:碎片Fragment完全解析 为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像 Activi ...
随机推荐
- c++面试常用知识(sizeof计算类的大小,虚拟继承,重载,隐藏,覆盖)
一. sizeof计算结构体 注:本机机器字长为64位 1.最普通的类和普通的继承 #include<iostream> using namespace std; class Parent ...
- Struts.xml中Action的method与路径的三种匹配方法
原文 http://blog.csdn.net/woshixuye/article/details/7734482 首先我们有一个Action——UserAction public class Us ...
- 2012-09-10 23:30 如何解决HtmlAgilityPack得到的InnerText中有残留的script、样式的问题
那么如何解决HtmlAgilityPack得到的InnerText中有残留的script.样式的问题呢,在google上搜索“HtmlAgilityPack script innerText”找到了s ...
- 细说gulp
一.概述&安装 Gulp,简而言之,就是前端自动化开发工具,利用它,我们可以提高开发效率. 比如: 1. 压缩js 2. 压缩css 3. 压缩less 4. 压缩图片 等等… 我们完 ...
- iOS 如何在整个屏幕中都能实现滑动返回的效果
- (void)setupGetsInNav { UIGestureRecognizer *gesture = self.interactivePopGestureRecognizer; gestur ...
- 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...
- Android置底一个View后运行报错
大致问题是 放一个LinearLayout ID @+id/layout ,然后在它上面放一个button 设置android:layout_above="@id/layout" ...
- Android PopupWindow怎么合理控制弹出位置(showAtLocation)
说到PopupWindow,应该都会有种熟悉的感觉,使用起来也很简单 // 一个自定义的布局,作为显示的内容 Context context = null; // 真实环境中要赋值 int layou ...
- mybatis入门基础(四)----输入映射和输出映射
一:输入映射 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型. 1.1.传递pojo的包装对象 1.1.1.需求描述 完成用户信息的综合查询, ...
- 一个基于mysql构建的队列表
通常大家都会使用redis作为应用的任务队列表,redis的List结构,在一段进行任务的插入,在另一端进行任务的提取. 任务的插入 $redis->lPush("key:task:l ...