美文网首页生活
Fragment本身以及他跟activity的交互

Fragment本身以及他跟activity的交互

作者: 草丛伦 | 来源:发表于2017-03-19 15:34 被阅读23次

    Fragment翻译过来就是碎片的意思,他能够作为一个组件的存在,拼凑出一个界面来,意味着activity很多部分可以抽成一个个碎片,以便能够复用。
    关于fragment的生命周期,用一张图来展示就可以了。

    3416944-eefed5297398cdfb.jpg

    以下说一些重点:
    1.Fragment在onAttach 开始跟Activity window绑定,这个时候 就已经可以通过getActivity来拿到activity实例了。
    2.fragment去inflate一个xml一般在onCreateView那边 ,不过也可以在onCreate里面inflate,然后在onCreateView去return ,这取决于你的想法,跟界面的布局。
    3.fragment跟activity绑定后,他的生命周期依赖于activity,那么意味着,activity中有多个fragment,通过viewpager和其adapter进行控制,当hide一个fragment,show一个fragment时,他的onResume方法可能不会被调用,因为没有影响到activity的生命周期。
    4.在生命周期方面,activity和fragment之间一个很重要的不同就是在各自的后台栈中是如何存储的。当activity停止时,默认情况下activity被安置在由系统管理的activity后台栈中;fragment仅当在一个事务被移除时,通过显式调用addToBackStack()请求保存的实例,该fragment才被置于由宿主activity管理的后台栈。

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) { 
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.example_fragment,
    container, false);
    }

    inflate()函数需要以下三个参数:
    (1).要inflate的布局的资源Id
    (2).被inflate的布局的父ViewGroup
    (3).一个布尔值,表明在inflate期间被inflate的布局是否应该附上ViewGroup(第二个参数container)。(在这个例子中传入的是false,因为系统已经将被inflate的布局插入到容器中(container)——传入true会在最终的布局里创建一个多余的ViewGroup)

    5.在android中,对fragment的事务操作都是通过FragmentTranSaction来执行。操作大致可以分为两类:
    1:>显示:add(), replace(), show(), attach()
    2:>隐藏:remove(), hide(), detach()
    说明:调用show() & hide()方法时,Fragment的生命周期方法并不会被执行,仅仅是Fragment的View被显示或者​隐藏。执行replace()时(至少两个Fragment),会执行第二个Fragment的onAttach()方法、执行第一个Fragment的onPause()-onDetach()方法,同时containerView会detach第一个Fragment的View。add()方法执行onAttach()-onResume()的生命周期,相对的remove()就是执行完成剩下的onPause()-onDetach()周期。

    6.关于onSaveInstanceState(Bundle outState),此方法是在fragment或者activity可能被销毁的情况下 ,就会被调用,即系统不清楚你的这次操作会不会带来销毁的结果,那么就会调用这个方法,比如按home键,界面跳转 等,并且 onRestoreInstanceState方法并不是一定对应的,意味着 前者被执行后,后者并不一定会被执行到。

    7.对于一些外界传进来的参数,记得用onSaveInstanceState保存一下,不然内存不足的情况下,很容易被回收掉,导致参数不存在,而显示空白。

    8.FragmentTransaction 可以做fragment的替换,获取事物之后,还可以设置 进出的动画。还有在调用commit()之前,可以将事务添加到fragment事务后台栈中(通过调用addToBackStatck())。这个后台栈由activity管理,并且允许用户通过按BACK键回退到前一个fragment状态。
    当移除一个fragment时,如果调用了addToBackStack(),那么之后fragment会被停止,如果用户回退,它将被恢复过来。
    调用commit()并不立刻执行事务,相反,而是采取预约方式,一旦activity的界面线程(主线程)准备好便可运行起来。然而,如果有必要的话,你可以从界面线程调用executePendingTransations()立即执行由commit()提交的事务。

    9.下面的代码中一个fragment代替另一个fragment,并且将之前的fragment状态保留在后台栈中:

    Fragment newFragment = new ExampleFragment();
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, newFragment);
    transaction.addToBackStack(null);
    transaction.commit();

    10.只能在activity保存状态(当用户离开activity时)之前用commit()提交事务。如果你尝试在那时之后提交,会抛出一个异常。这是因为如果activity需要被恢复,提交后的状态会被丢失。对于这类丢失提交的情况,可使用commitAllowingStateLoss()。

    11.管理Fragment回退栈

    跟踪回退栈的状态
    我们通过实现OnBackStackChangedListener接口来实现回退栈状态跟踪,具体代码如下:
    
    //implements接口
    public class XXX implements FragmentManager.OnBackStackChangedListener 
    //实现接口所要实现的方法
    @Override
    public void onBackStackChanged() {
      //do whatevery you want
    }
    //设置回退栈监听接口
    getSupportFragmentManager().addOnBackStackChangedListener(this);
    
    管理回退栈
    (1).FragmentTransaction.addToBackStack(String)
    将一个刚刚添加的Fragment加入到回退栈中
    (2).getSupportFragmentManager().getBackStackEntryCount()
    获取回退栈中的实体数量
    (3).getSupportFragmentManager().popBackStack(String name, int flags)
    根据name立刻弹出栈顶的fragment
    (4).getSupportFragmentManager().popBackStack(int id, int flags)
    根据id立刻弹出栈顶的fragment
    

    相关文章

      网友评论

        本文标题:Fragment本身以及他跟activity的交互

        本文链接:https://www.haomeiwen.com/subject/sbrogttx.html