不是所有的情况都是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()
}
}
发表评论