fragment 踩坑onPause()

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

猜你喜欢

转载自blog.csdn.net/luoro/article/details/127656836