fragment解析

fragment 主要方法:
onAttach(Activity activity)
onAttach(Context context)
当fragment与Activity发生关联时调用,我们可以在此方法中通过getArguments()获取传入的Bundle参数
使用fragment时,一般不要使用getActivity()而是在此方法中 activity= (Activity) context;

OnCreateView(LayoutInflater, ViewGroup,Bundle)
创建该Fragment的视图

onActivityCreated(Bundle bundle)
当activity的onCreate方法返回时调用

setUserVisibleHint(boolean isVisibleToUser)
当使用viewPager在页面切换的时候会调用,我们可以根据isVisibleToUser的值来处理部分原本在onResume()中的逻辑,isVisibleToUser为true时,当前fragment可见。

onResume()
当页面可见的时候,该方法就会被调用
当从fragment中跳转到另一个activity,再返回的时候,fragment附属的activity下的所有fragment的onResume()都会被执行,所以在使用该方法的时候,就需要考虑一下性能问题了,减少不必要的卡顿,不要试图先堆积代码,再优化代码,后面你会发现你根本没有时间去优化!

onDestoryView()
视图 被移除的时候调用

onDetach()
与onAttach成对出现,fragment与activity关联被取消时调用


在onCreateView方法中需要注意的是inflate()的第三个参数是false,因为在fragment内部实现中,会把布局添加到container中,如果设置成true,会别重复添加,这时会报异常

在创建fragment时传入参数,必须通过setArgument(Bundle bundle)方法添加,而不建议通过fragment带参数的构造函数,
因为通过setArgument()方式添加,在由于内存紧张导致fragment被系统杀掉并恢复时,能保留这些数据。

静态设置fragment方法:
fragment解析_第1张图片

注意:标签中name属性指定了布局中实例化fragment类,activity使用此方法加载fragment时,不需要做什么处理,直接把所有的逻辑处理放到Fragment中就可以了。

每个fragment的id不能重复,否者可能会出现一些奇怪的bug
每个fragment需要一个唯一的id,如果重启activity,系统可用来恢复Fragment(并可用来捕捉fragment的事务处理,例如:移除fragment)
添加id的方法:
1:>用android:id属性提供一个唯一的标识
2:>用android:tag属性提供一个唯一的字符串。
3:>如果上述两种属性都没有,系统会使用其容器视图(view)的ID。

在activity中管理fragment:
1:>使用findFragmentById()(用于在activity布局中提供有界面的fragment或者findFragmentByTag()获取activity中存在的fragment(用于有界面或者没有界面的fragment))

2:>使用popBackStack()(模仿用户的Back命令)从后台栈弹出fragment。

3:>使用addOnBackStackChangeListener()注册一个监听后台栈变化的监听器。

在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()周期。

获取fragment管理类的时候,到底该使用getChildFragmentManager还是getSupportFragmentManager 还是getFragmentManager?
当fragment直接加载到activity时:
1、fragment使用的是app包中的话,使用getFragmentManager()
2、fragment使用的是v4包的话,使用getSupportFragmentManager()
当fragment直接加载到fragment时:使用getChildFragmentManager()

注:getChildFragmentManager()获取的是fragment的FragmentManager而getSupportFragmentManager和getFragmentManager获取的是activity中的FragmentManager

getChildFragmentManager()获取到的是当前fragment的Fragmentmanager
getSupportFragmentManager()获取的是当前activity的FragmentManager,使用此类会把fragment直接加载到activity的Fragment中
示例代码:FragmentActivity的xml中

fragment解析_第2张图片

FragmentActivity中

fragment解析_第3张图片

示例代码:Fragment1的xml

fragment解析_第4张图片

 

示例代码:Fragment1


 

注意:这里用的是add而不是replace

transaction.remove
从activity中移除,如果被移除的fragment没有添加到回退栈中,这个fragment实例将会被销毁

transaction.replace
是remove和add的合集,这种当时加载fragment,就是放入回退栈,view也会被移除,会执行onDestoryView,
验证方式:在当前fragment中加入一个EditeText控件,并调用键盘随意输入内容,从下个fragment返回的时候,看之前的内容是否还在

你可能感兴趣的:(fragment)