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

  • 相关阅读:
    2016"百度之星"
    ZOJ 3703 Happy Programming Contest(01背包的灵活运用)
    LA 3942 Remember the Word (Trie树)
    ZOJ 3700 Ever Dream(Vector)
    Hdoj 1686 Oulipo
    2017总结,2018计划
    Ubuntu16.04 + caffe-ssd + [CPU_ONLY] + KITTI 训练总结
    【转载】The Elements of Programming Style之代码风格金科玉律
    qt中setStyleSheet导致的内存泄漏
    【转】用枚举定义有意义的数组下标
  • 原文地址:https://www.cnblogs.com/misybing/p/4867828.html
Copyright © 2011-2022 走看看