关于多个fragment复用同一个占位View产生的问题及解决
2017-09-06 00:00
387 查看
在大多数项目中都会用到点击标签栏切换页面这种功能,它的实现方式也有多种,从最早的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 方法
可以发现
关于替换的方式
占位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 方法
可以发现
相关文章推荐
- 一个关于MFMessageComposeViewController的ios7中的诡异问题 收件人视图黑色 和解决方式
- 关于有多个Fragment中的textview跑马灯问题
- 关于有多个Fragment中的textview跑马灯问题
- 关于UITableView的cell复用问题的3种解决方法
- Activity中包含多个Fragment,Afragment中嵌套ViewPager,在第二次切换到Afragment时Viewpager内容被清空的问题解决
- 一个关于MFMessageComposeViewController的ios7中的诡异问题 收件人视图黑色 和解决方式
- 关于BadgeView遇到的一个奇怪的问题和解决办法
- 关于TableView中不止一个section的情况下首个cell的y轴不为0的会造成的问题和解决办法
- 关于fragment切换后,viewpager自动隐藏的问题解决
- 关于有多个Fragment中的textview跑马灯问题
- 解决ViewPager上多个Fragment之间切换被重新实例化的问题
- 解决fragment中嵌套viewpager,vierpager中有多个fragment,不显示的问题
- 关于Fragment中定义一个ListView,然后给这个ListView添加header(ViewPager)的问题
- 关于VC写DLL文件产生的一个fatal errorc1083问题的解决办法
- 关于listview中用checkbox滚动时产生view复用的问题
- ASP.Net下如何解决关于Access数据库“操作必须使用一个可更新的查询”问题
- “在系统启动时至少有一个服务或驱动程序产生错误”,终于解决这个其实很简单又很烦人的问题
- 一个我很长时间才解决的关于xp与2000共享的网络问题
- 纯属巧合,解决了一个困扰许久的问题,关于网卡设置时提示“系统找不到指定文件”。
- 关于在myeclipse中用jsp访问实体bean的一个问题的解决(Exception sending context initialized event to listener instance of class)