项目中经常会碰到,需要在fragment失去焦点和获得焦点的方法中进行一些设置,但是fragment没有onpause()和onResume()方法,你重写的这两个方法,都是fragment依附的activity的生命周期。
那么需要fragment有像activity生命周期onpause()和onResume()这样的方法怎么办,谷歌为我们提供了setUserVisibleHint和onHiddenChanged这两个方法,这两个方法的使用场景是有所不同的!
1.FragmentPagerAdapter+ViewPager的使用场景
● 使用setUserVisibleHint
使用FragmentPagerAdapter+ViewPager时,切换回上一个Fragment页面时(已经初始化完毕),不会回调任何生命周期方法,也不会走onHiddenChanged()方法,所以在viewPage配合fragment搭建页面的情况下,切换页面时候,只能使用setUserVisibleHint方法。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// 相当于onResume()方法
} else {
// 相当于onpause()方法
}
}
viewpager+fragment中调用setUserVisibleHint的fragment的生命周期:
1 E/myfragment: setUserVisibleHint=false
2 E/myfragment: onAttach
3 E/myfragment: onCreate
4 E/myfragment: onCreateView
5 E/myfragment: onActivityCreated
6 E/myfragment: onStart
7 E/myfragment: onresume
8 E/myfragment: setUserVisibleHint=true //该fragment可见时
9 E/myfragment: setUserVisibleHint=false //该fragment不可见时
10 E/myfragment: onPause
11 E/myfragment: onStop
12 E/myfragment: onDestroyView
13 E/myfragment: onDestroy
14 E/myfragment: onDetach
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
说明:1-7生命周期是fragment初始化并加载到viewpager中时执行的。10-14是viewpager所在的activity被销毁过程中,fragment的生命周期执行过程。8是切换到该fragment可见时,9是该fragment不可见时。
2.Fragment ,add()+show()的使用场景
● 使用onHiddenChanged的使用
hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged(),所以一般会和onresume()方法配合使用。具体场景自己来判断。
@Override
public void onHiddenChanged(boolean hidden) {
if (hidden) {
//相当于Fragment的onPause
System.out.println("界面不可见");
} else {
// 相当于Fragment的onResume
System.out.println("界面可见");
}
}
另附:onHiddenChanged的回调时机
当使用add()+show(),hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged()。
Fragment内控制切换Fragment!
//确定后跳到抓取图片碎片:Resultragment
ManagerActivity managerActivity =(ManagerActivity) getActivity();
managerActivity.setSelect(0);//切换到抓取成功fragment!
前提是主Activity内写好了选择碎片的方法 如setSelect(0);