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

  • 相关阅读:
    JLOI2012:时间流逝
    bzoj 5217: [Lydsy2017省队十连测]航海舰队
    bzoj 4894: 天赋
    bzoj 4870: [Shoi2017]组合数问题
    bzoj 1558: [JSOI2009]等差数列
    bzoj 4945: [Noi2017]游戏
    bzoj 2142: 礼物
    bzoj 5248: [2018多省省队联测]一双木棋
    51nod2383
    codeforces24D
  • 原文地址:https://www.cnblogs.com/misybing/p/4867828.html
Copyright © 2011-2022 走看看