美文网首页Android技术知识Android开发Android技术进阶
监听Fragment B对用户是否可见——判断Fragment

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

作者: 安卓搬砖小曾 | 来源:发表于2019-05-12 12:09 被阅读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的显示状态来刷新数据

    相关文章

      网友评论

        本文标题:监听Fragment B对用户是否可见——判断Fragment

        本文链接:https://www.haomeiwen.com/subject/sgqcaqtx.html