1. 程式人生 > >監聽Fragment B對使用者是否可見——判斷Fragment A切回到Fragmnet B、Fragment B跳到Activity 再從Activity返回到Fragment B

監聽Fragment B對使用者是否可見——判斷Fragment A切回到Fragmnet B、Fragment B跳到Activity 再從Activity返回到Fragment B

背景

      最近在開發中遇到了一個問題,我們的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
   }
}

      2.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的顯示狀態來重新整理資料