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

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

Android Fragment 真正的完全解析(上)

Android 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()一次,否则也存在重复提交问题。

[原创] Fragment的添加、移除问题的更多相关文章

  1. Android Fragment动态添加 FragmentTransaction FragmentManager

    Fragment常用的三个类:android.app.Fragment 主要用于定义Fragmentandroid.app.FragmentManager 主要用于在Activity中操作Fragme ...

  2. Fragment中添加ListView而不使用ListFragment

    最初的构想是,将Fragment和ViewPager结合起来, 然后突发奇想,在第一个Fragment里添加了ListView, 依照网上的建议,extends了ListFragment,接着各种报错 ...

  3. Android Fragment学习笔记(二)----Fragment界面添加和管理

    Fragment界面添加 了解过fragment的生命周期等简单知识,于是去看官方文档来了解更多相关内容,要添加fragment到我们的UI界面中,给出了两种常用的方法,第一个是在activity的布 ...

  4. VC6IDE环境宏辅助添加移除注释

    VC6很老了(15年),当年的IDE功能不如现在的各种IDE功能丰富. 比如自动添加注释,就需要借助第三方插件或自己动手实现. 最近做些code试验,新装上了VC6,但是改代码时不能自动添加注释,很不 ...

  5. 海思3531添加移远EC20 4g模块(转)

    源: 海思3531添加移远EC20 4g模块 Hi3798移植4G模块(移远EC20)

  6. a标签添加移除事件及开启禁用事件

    一.添加移除点击事件 <script type="text/javascript" src="jquery.min.js"></script& ...

  7. Jquery下拉列表添加移除数据

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. JQ添加移除css样式

    1. addClass() - 添加CSS类 $("#target").addClass("newClass"); //#target 指的是需要添加样式的元素 ...

  9. JQ添加移除css样式--转载 心存善念

    我们常常要使用Javascript来改变页面元素的样式.其中一种办法是改变页面元素的CSS类(Class),这在传统的Javascript里,我们通常是通过处理HTML Dom的classname特性 ...

随机推荐

  1. request.getParameter() 、 request.getInputStream()和request.getReader() 使用体会

    request.getParameter(). request.getInputStream().request.getReader()这三种方法是有冲突的,因为流只能被读一次.比如:当form表单内 ...

  2. win7 下与mac虚拟机的共享文件的建立

    1. 确保针对Mac虚拟机的VMware Tools的安装 加载进入系统后,在mac里可看到安装和卸载vmware tools的两个图标(点开vmware tools磁盘),点安装的就可以了. 2. ...

  3. FILTER优化

    explain plan for select a.* from fxqd_list_20131115_new_100 a where (acct_no, oper_no, seqno, trans_ ...

  4. .config-20150410

    ## Automatically generated file; DO NOT EDIT.# OpenWrt Configuration#CONFIG_MODULES=yCONFIG_HAVE_DOT ...

  5. poj2954

    水题,先用叉积求三角形面积然后求三边上的点(由公约数上点)a然后用pick定理S=a+b/2-1就可以求出内部的点数了 var x,y,xx,yy,a1,a2,a3,x1,x2,x3,y1,y2,y3 ...

  6. Nginx 代理 jira 和 confluence

    原文出处:http://blog.chenlb.com/2012/01/nginx-proxy-jira-and-confluence.html jira 和 confluence 想部署到同一台机器 ...

  7. Linux Shell编程(30)——别名

    Bash别名本质上是一个简称, 缩写, 这可避免键入过长的命令序列. 例如,如果我们添加 alias lm="ls -l | more" 这一行到文件~/.bashrc file里 ...

  8. C#针对DataTable进行分页方法

    以下的分页方法是针对数据量不是非常大的数据进行的,是在内存中进行的分页操作. /// <summary> /// DataTable分页 /// </summary> /// ...

  9. HDOJ 1716 排列2(next_permutation函数)

    Problem Description Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表四张卡 ...

  10. net user命令

    net user net user 用户名 net user 用户名 密码 /add net user 用户名 /del net localgroup administrators net local ...