Fragment本身以及他跟activity的交互

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

Fragment本身以及他跟activity的交互_第1张图片
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的交互)