Android技术知识Android开发Android技术进阶

监听Fragment B对用户是否可见——判断Fragment

2019-05-12  本文已影响8人  安卓搬砖小曾

最近在开发中遇到了一个问题,我们的app主要是由底部Tab页的Fragment构成,然而需要监听当某一个Fragment对用户可见时就需要刷新当前的Fragment。而在不同的使用情况下,判断Fragment是否可见的方法是不一样的。下面对这些不同的使用情况分开分析:

  1. 现在安卓市场上基本上的app都会做tab页,而tab页基本都是通过android自带的ViewPager或者RadioGroup实现的。ViewPager有这样一个特点,当滑到某一个Tab时,它会同时加载这个tab的左右两个tab页,比如我从1页面切换到了2页面,那么3页面的onResume也被调用了,但是3页面其实对用户是不可见的。这时候我们就需要监听setUserVisibleHint来判断到底对用户是否可见。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
   if(isVisibleToUser){
   //TODO now it's visible  to user
   } else {
   //TODO now it's invisible to user
   }
}
  1. RadioGroup就没有同时加载左右两个View的属性,但当某一个RadioButton被选中时,由不可见状态转变成可见状态,可以使用onHiddenChanged来判断fragment的显示状态。
//判断当前的fragment显示状态
  @Override
  public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {
      //TODO now it`s visible to user
    }else {
     //TODO now it`s invisible to user
    }
   
  }

说到这里,是不是会觉得这么简单就实现了监听,请稍安勿躁,继续往下看完。我们依然不能完全依赖setUserVisibleHint这个方法来判断是否ViewPager中的页面是否对用户可见。因为该方法只有在Fragment之间切换的时候被调用。同理在RadioGroup中不能只使用onHiddenChanged来监听某一个Fragment的显示状态。因为还存在一种情况,比如我从一个Fragment A跳转到另一个activity,然后再回到这个Fragment A,那么ViewPager中的这个Fragment A的 setUserVisibleHint方法和RadioGroup中的onHiddenChange的方法是不会被调用的。

那么针对这种情况,用广播的方法实现监听Fragment的显示状态,在Activity的onDestory方法中发送广播:

@Override
  public void onDestroy() {
    super.onDestroy();
    Intent intent = new Intent("android.intent.action.CART_BROADCAST");
    intent.putExtra("data","ToDO");
    LocalBroadcastManager.getInstance(AddFriendToContact.this).sendBroadcast(intent);
    sendBroadcast(intent);
  }

在Fragment中重写onActivityCreated方法:

@Override
 public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
        LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(getActivity());
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("android.intent.action.CART_BROADCAST");
        BroadcastReceiver mItemViewListClickReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent){
                String msg = intent.getStringExtra("data");
                if("ToDO".equals(msg)){
                    //TODO YOU DO!
                }
            }
        };
        broadcastManager.registerReceiver(mItemViewListClickReceiver, intentFilter);
    }

返回到Fragment时 ,在onActivityCreated方法中接收到广播就说明当前的Fragment处于可见状态。以上方法同样可以用于监听当前Fragment的显示状态来刷新数据

上一篇下一篇

猜你喜欢

热点阅读