• Fragment回退栈&commit()和commitAllowingStateLoss()


    Activity切换时是通过栈的形式,不断压栈出栈,在Fragment的时候,如果你不是手动开启回退栈,它是直接销毁再重建,但如果将Fragment任务添加到回退栈,情况就会不一样了,它就有了类似Activity的栈管理方式。

    使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction。

    可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,当用户按返回键时,就会自动回到上一个fragment的状态。和Activity一样的使用体验

    public void startToFragment(Context context, int container, Fragment newFragment) {
            FragmentManager manager = context.getFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(container, newFragment);
            transaction.addToBackStack(context.getClass().getName()); 
         transaction.commit();
    }
    Fragment2 fragment2 = new Fragment2 ();
    startToFragment(getActivity(), R.id.layout_container, fragment2 );

    1,在FragmentManager.transaction.addToBackStack();向一个栈中一个一个的添加Fragment,从而实现在你添加后,可以在按返回键时一个一个的返回Fragment

    2,FragmentManager的popBackStack()方法,就是一个一个的返回Fragment

    3,FragmentManager的popBackStack(name,flag)方法,就是

       //其中name是加入栈中的Fragment名字

       //flag表示移走栈中Fragment的方式(0:把自己之前的弹出)(1:包括自己都弹出)

    4,FragmentManager的popBackStack(id,flag)方法

       //其中id,在FragmentManager事物提交时,会返回一个int值,每次提交会自动加1

       //flag表示移走栈中Fragment的方式(0:把自己之前的弹出)(1:包括自己都弹出)

    (补充:FragmentManager.commit()会返回一个int值,标记这次的提交!!)

    https://www.jianshu.com/p/b8aca9976608

    commit()和commitAllowingStateLoss()的区别

    Fragment的控制采用事务方式执行,在事务执行之前,用户可能已经点击了返回键,导致Activity的onSaveInstanceState()方法被调用,在保存当前activity实例的状态以备恢复。

    在onSaveInstanceState()方法中会将一个成员变量mStateSaved设为true。采用commit()方式提交事务,在执行时会检查mStateSaved的值,若为true,则会抛出异常。因此事务必须保证在用户点击返回键之前执行。

    而采用commitAllowingStateLoss()方式提交事务,在执行时不会检查mStateSaved的值,不会发生异常。

  • 相关阅读:
    [Cordova] 无法编译Visual Studio项目里Plugin副本的Native Code
    [Cordova] 无法显示Alert视窗
    [ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能
    [Tool] SourceTree初始化GitFlow遇到错误(git command not found)的解决方案
    [.NET] 使用Json.NET提供依赖注入功能(Dependence Injection)
    [AngularJS] 使用AngularCSS动态加载CSS
    [AngularJS] 使用AngularAMD动态加载Service
    [AngularJS] 使用AngularAMD动态加载Controller
    [Tool] Chrome内的本地网页,使用XMLHttpRequest读取本地档案
    [Android] WebView内的本地网页,使用XMLHttpRequest读取本地档案
  • 原文地址:https://www.cnblogs.com/genggeng/p/9959974.html
Copyright © 2020-2023  润新知