不是所有的情况都是fragment在可见的时候才走onPause()
有时候这个fragment在还未可见的时候就走了onResume()会导致一些问题,比如说我遇到的:
场景:
在fragment1中的onResume()中去监听wifi的连接状态,如果在连接状态中,则让其去开启一个动画,连接状态结束后会去关闭这个动画,我给这个动画设置了一个监听,让其在监听到这个动画结束的时候去做一些操作,然后切换到fragment2去切换黑夜白天模式使得整个程序重走生命周期。
问题:
在fragment2中切换模式后,快速切换回fragment1,这个wifi还在连接状态,动画开启,也收到监听;但在fragment2中切换模式后,过一会再切回fragment1,这个时候wifi连接已经是完成状态。
按理来说,在fragment2中切换模式后,再切回fragment1,这时wifi已经是连接完成状态,那么应该播放了动画,并且收到监听,最开始以为是动画监听的问题,但是打了log发现这个动画竟然都没有开始!!!!
原因:
fragment虽然有onResume()和onPause(),但这两个方法都是Activity的,调用时机与Activity相同,切换黑夜白天模式,系统重走生命周期,此时因为这个activity中的fragment在viewpager中通过hide来进行了切换,所以都走了onResume(),而虽然你将这个动画的view设置为了visible,也在wifi开始连接的时候开始了这个动画,但是整个fragment1是不可见的,所以动画并不会开始,自然也就收不到监听回调了,感叹一声,onPause()在viewpager与fragment的结合使用时是真鸡肋呀!!!
解决:让这个fragment在可见的时候才走onResume()方法
那么问题来了,我们怎么才能知道fragment是可见还是不可见的呢?
谷歌为我们提供了两个方法,分别是setUserVisibleHint和onHiddenChanged这两个方法,注意这两个方法的使用场景是不相同的.
1、setUserVisibleHint的使用场景:譬如,谷歌自带的TabLayout控件,此种场景下,当我们切换fragment的时候,会调用setUserVisibleHint方法,不会调用onHiddenChanged方法,也不会走fragment的生命周期方法
@Override
public void setUserVisibleHint(boolean isVisibleToUser){
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser){
//相当于onResume();
}else{
//相当于onPause();
}
}
2、onHiddenChanged的使用场景: 一般我们打开应用时底部会有四五个tab键,使用add()+show()来显示和隐藏Fragment,hide()跳转新的Fragment时,旧的Fragment回调onHiddenChanged(),不会回调onStop()等生命周期方法,而新的Fragment在创建时是不会回调onHiddenChanged(),所以一般会和onresume()方法配合使用
@Override
public void onHiddenChanged(boolean hidden) {
if (hidden) {
//相当于Fragment的onPause()
} else {
// 相当于Fragment的onResume()
}
}