zoukankan      html  css  js  c++  java
  • Fragment保持状态切换,fragment状态切换

    在使用Activity管理多个Fragment时,每次切换Fragment使用的是replace,结果导致出现xxx is not currently in the FragmentManager异常挂掉

    网上说使用replace切换会使被切换的Fragment给替换掉,从而被被切换的Fragment的view从viewtree中删除,致使切换过程中每次都要重新创建Fragment

    每次使用add添加Fragment,当再次切换到时用show显示,而被切换的Fragment用hide隐藏,具体代码如下:

     1     /**
     2      * Fragment跳转
     3      * @param fm
     4      * @param fragmentClass
     5      * @param tag
     6      * @param args
     7      */
     8     public void turnToFragment(Class<? extends Fragment> fromFragmentClass, Class<? extends Fragment> toFragmentClass, Bundle args) {
     9         
    10         FragmentManager fm = getSupportFragmentManager();
    11         //被切换的Fragment标签
    12         String fromTag = fromFragmentClass.getSimpleName();
    13         //切换到的Fragment标签
    14         String toTag = toFragmentClass.getSimpleName();
    15         //查找切换的Fragment
    16         Fragment fromFragment = fm.findFragmentByTag(fromTag);
    17         Fragment toFragment = fm.findFragmentByTag(toTag);
    18         //如果要切换到的Fragment不存在,则创建
    19         if (toFragment == null) {
    20             try {
    21                 toFragment = toFragmentClass.newInstance();
    22                 toFragment.setArguments(args);
    23             } catch (java.lang.InstantiationException e) {
    24                 e.printStackTrace();
    25             } catch (IllegalAccessException e) {
    26                 e.printStackTrace();
    27             }
    28         }
    29         //如果有参数传递,
    30         if( args != null && !args.isEmpty() ) {
    31             toFragment.getArguments().putAll(args);
    32         }
    33         //Fragment事务
    34         FragmentTransaction ft = fm.beginTransaction();
    35         //设置Fragment切换效果
    36         ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out,
    37                 android.R.anim.fade_in, android.R.anim.fade_out);
    38         /**
    39          * 如果要切换到的Fragment没有被Fragment事务添加,则隐藏被切换的Fragment,添加要切换的Fragment
    40          * 否则,则隐藏被切换的Fragment,显示要切换的Fragment
    41          */
    42         if( !toFragment.isAdded()) {
    43             ft.hide(fromFragment).add(R.id.content_frame, toFragment, toTag);
    44         } else {
    45             ft.hide(fromFragment).show(toFragment);
    46         }
    47         //添加到返回堆栈
    48 //        ft.addToBackStack(tag);
    49         //不保留状态提交事务
    50         ft.commitAllowingStateLoss();
    51     }

     这里有个FragmentTransaction(事务),这个是Fragment切换的核心类,它有两个方法:replace,add,一个是替换Fragment,一个是添加Fragment,两者的区别是:replace=remove掉旧fragment,add新的fragment,

    当我们的应用(即管理多个Fragment的Activity)运行到后台时(即推出当前屏幕),会触发Activity的onPause()方法,而Activity的onPause()会调用它所管理的Fragment的同样的方法,但是当我使用replace时,已经remove掉了原来的Fragment,所以当调用原理的Fragment的onPause()方法就回不粗在,就会出现上述xxx is not currently in the FragmentManager的异常推出,有debug为证:

    android的Fragment切换时怎保存状态,避免重复调用onCreateView()

     

    在sdk sample的APIdemo 的FragmentHideShow.java
     

    actionbar+Fragment 来回切换怎保持不了状态

     

    生成了 2个 fragment 点击之后就替换 结果 来回切换后后 textview里的内容是随机的? 按理说 creat 就调用一次啊?求解答!

  • 相关阅读:
    Jetson TX1使用usb camera采集图像 (2)
    Jetson TX1安装pyTorch
    Jetson TX1 install Opencv3
    Jetson TX1使用usb camera采集图像 (1)
    win10双系统安装卸载ubuntu
    弱监督下的目标检测算法
    javascript高级程序设计读书笔记
    好用的linux命令
    正则表达式学习
    yii执行原理
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4618049.html
Copyright © 2011-2022 走看看