博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[原创] Fragment的添加、移除问题
阅读量:4616 次
发布时间:2019-06-09

本文共 1307 字,大约阅读时间需要 4 分钟。

安卓一直在进化,Fragment就是个好东西,如果早5年做安卓开发,真要麻烦的多。

 

关于Fragment的讲解,这里很详尽:

看完后可以进行Fragment的基本功能使用,最广为人知的就是微信主界面的例子了。

 

一般情况下,多个Fragment切换显示不同内容,会使Fragment实例化一个空的FrameLayout界面布局,并且初始化一个Fragment填充该布局。

而我的产品设计并非如此,所以使用时有了问题,通过FragmentManager很好地解决了问题,于此记之。

 

问题描述:

Activity里的FrameLayout非空,有子布局ListView,在点击按钮后调用Fragment填充该FrameLayout,这样ListView就被替换掉,不显示。代码如下:

private FragmentManager frg_mng = getFragmentManager(); //全局变量FragmentTransaction ft = frg_mng.beginTransaction();switch(s) {case a:  ft.replace(R.id.layout_note_list, mInfo_frg).commit();break;case b:  ft.replace(R.id.layout_note_list, mUsers_frg).commit();break;}

 此时两个Fragment mInfo_frg和mUsers_frg互相切换,那么如何显示Fragment所填充的FrameLayout下的ListView呢?显然要关闭两个Fragment,使用remove()方法可实现。

即:

FragmentTransaction ft = frg_mng.beginTransaction();ft.remove(mUsers_frg).commit();ft.remove(mInfo_frg).commit();

但是Fragment移除后,主Activity出错闪退。其原因是定义一次beginTransaction()方法只能commit()提交一次,要关闭两个Fragment,需要定义两个beginTransaction(),即:

FragmentTransaction ft_a = frg_mng.beginTransaction();FragmentTransaction ft_b = frg_mng.beginTransaction();ft_a.remove(mUsers_frg).commit();ft_b.remove(mInfo_frg).commit();

这样,两个Fragment都顺利关闭,不再鸠占鹊巢,原FrameLayout下的ListView自然就能显示了,问题解决。

注意:在第一段代码中使用了switch语句做条件判断,这样beginTransaction()就只commit()一次,否则也存在重复提交问题。

 

转载于:https://www.cnblogs.com/misybing/p/4867828.html

你可能感兴趣的文章
各种浏览器的user-agent和
查看>>
Restful levels
查看>>
Phonegap移动开发:布局总结(一) 全局
查看>>
Java 变参函数的实现
查看>>
nrf51 SDK自带例程的解读
查看>>
SESSION技术
查看>>
数据结构(五)之直接插入排序
查看>>
SQL函数——LENGTH()和LENGTHB()
查看>>
vim - manual -个人笔记
查看>>
详解Javascript中prototype属性(推荐)
查看>>
angularjs实现首页轮播图
查看>>
Git 对象 和checkout 和stash的笔记
查看>>
团队项目总结2-服务器通信模型和顺序图
查看>>
hdu 1085 Holding Bin-Laden Captive!
查看>>
[周记]8.7~8.16
查看>>
递归定义
查看>>
kindeditor 代码高亮设置
查看>>
图的邻接表存储
查看>>
2018 leetcode
查看>>
各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异
查看>>