文档章节

关于多个fragment复用同一个占位View产生的问题及解决

走世界
 走世界
发布于 2017/09/06 15:51
字数 406
阅读 16
收藏 0

     在大多数项目中都会用到点击标签栏切换页面这种功能,它的实现方式也有多种,从最早的tabhost+view,tablayout+viewpager,textview+viewpager,RadiuButton + FrameLayout 以及后面出的BottomNavigationView等等,原理都是用一个占位View承载fragment,通过点击标签或者滑动来切换不同的页面。

      关于替换的方式

      占位view的最常见的一种写法  

    这样就相当于用这个View搭载了Frgament。直接这样写本来是没问题的,但是如果类中有网络请求这样的耗时任务,快速频繁的切换会导致崩溃,NoPointerException,ResouceNotFoundException。

      解决方法,给每一个frgament都绑定一个View,不要共用一个View,通过view.setVisibility的方式控制显示隐藏,然后就完美解决崩溃的问题。

      之后想想如果有多个fragment来回切换, 并且页面中有edittext 输入框的话,.replace方法每次都会重新实例化fragment,导致前面我们填的内容丢失。更加优雅的方式是使用Fragment提供的事务FragmentTransaction,然后用add的方法,而不是每次都用replace。

在获取FragmentTransaction对象后调用add方法。在add之前断一下Fragment对象是否为空,不为空的话就用ft的hide方法把Fragment隐藏起来,然会出现布局重叠的情况。

        public void hideFragment(FragmentTransaction ft){ 

if (oneFm!=null){

ft.hide(oneFm); }}

 

然后自行对比一下切换后输入框内容区别:

 replace方法

 

add 方法

可以发现

 

 

© 著作权归作者所有

走世界
粉丝 7
博文 96
码字总数 91434
作品 0
和平
程序员
私信 提问
Android Fragment---设计理念

Android在Android3.0中引入了Fragment,主要用于支持在大屏幕上进行更多的动态和灵活的UI设计,如平板电脑。因为平板电脑的屏幕比手持设备要大,因此有更多的空间用于UI组件的组合和互换。F...

长平狐
2012/10/16
287
0
Fresco几处不太好的地方

Drawees 不支持 属性 强制性的宽高,你必须声明 和 。如果没有在XML中声明这两个属性,将无法正确加载图像。 wrap_content Drawees 不支持 属性。 所下载的图像可能和占位图尺寸不一致,如果...

Mstart
2016/04/18
533
0
Android开发规范

一、Android 编码规范 1.java 代码中不出现中文,最多注释中可以出现中文 2.局部变量命名、静态成员变量命名 只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写 3.常量命名 ...

wwwmmm
2014/09/26
438
1
工作小结,简单的主页框架,可左右滑动,viewpage+fragment,

一款安卓应用,好歹也是一个系统啊,既然称得上是系统,就要考虑系统的稳定性,功能模块的耦合性,复用程度等等,所以一个好的开发模型必然达到事半功倍的效果。 目前(2015年11月),常见的...

Carbenson
2015/11/18
621
0
Android开发规范(编码+性能+UI)

现在为你带来Android开发规范,包括Android编码规范,Android性能优化以及Android UI优化。 一、Android编码规范 1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量命名、静态成员...

丨小丶牧灬
2015/07/27
339
1

没有更多内容

加载失败,请刷新页面

加载更多

最好的重试是指数后退和抖动

1. 概述 在本教程中,我们将探讨如何使用两种不同的策略改进客户端重试:指数后退和抖动。 2. 重试 在分布式系统中,多个组件之间的网络通信随时可能发生故障。 客户端应用程序通过实现重试来...

liululee
25分钟前
4
0
聊一聊大厂内部的安全管理机制

工作了两个月了体会到了很多之前做外包小项目没有的东西,不得不说大厂的还是有自己一套的完善的体制,不会像B站那样泄露自己整个后台的源码这种事情发生。 电脑办公 比如说在使用电脑办公这...

gzc426
52分钟前
4
0
如何利用deeplearning4j中datavec对图像进行处理

NativeImageLoader Labelloader = new NativeImageLoader(112, 112, 3,new FlipImageTransform(-1)); 一、导读 众所周知图像是有红绿蓝三种颜色堆叠而成,利用deeplearning对图像处理,必须把...

冷血狂魔
54分钟前
8
0
1. Context - React跨组件访问数据的利器

《react-router-dom源码揭秘》系列 2. React-Router的基本使用 3. react-router-dom源码揭秘 - BrowserRouter Context提供了一种跨组件访问数据的方法。它无需在组件树间逐层传递属性,也可以...

前端老手
今天
6
0
Docker入门实战--开篇,为什么要使用Docker

前面Thrift文章中,我曾经介绍过我为什么要用Thrift。Docker的使用却是不一样的。纯属没事找事,因为我现在一个人的团队,项目只要一个project目录足够了! 那我何苦要用Docker呢 各位且听听...

后天的奇点
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部