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