zoukankan      html  css  js  c++  java
  • [原创] Fragment的添加、移除问题

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

  • 相关阅读:
    从句分析
    artDialog ( v 6.0.2 ) content 参数引入页面 html 内容
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 13 罗马数字转整数
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 12 整数转罗马数字
    Java实现 LeetCode 11 盛最多水的容器
    Java实现 LeetCode 11 盛最多水的容器
  • 原文地址:https://www.cnblogs.com/misybing/p/4867828.html
Copyright © 2011-2022 走看看