最近在開(kāi)發(fā)中遇到了一個(gè)問(wèn)題,我們的app主要是由底部Tab頁(yè)的Fragment構(gòu)成蛙卤,然而需要監(jiān)聽(tīng)當(dāng)某一個(gè)Fragment對(duì)用戶可見(jiàn)時(shí)就需要刷新當(dāng)前的Fragment。而在不同的使用情況下噩死,判斷Fragment是否可見(jiàn)的方法是不一樣的颤难。下面對(duì)這些不同的使用情況分開(kāi)分析:
- 現(xiàn)在安卓市場(chǎng)上基本上的app都會(huì)做tab頁(yè),而tab頁(yè)基本都是通過(guò)android自帶的ViewPager或者RadioGroup實(shí)現(xiàn)的已维。ViewPager有這樣一個(gè)特點(diǎn)行嗤,當(dāng)滑到某一個(gè)Tab時(shí),它會(huì)同時(shí)加載這個(gè)tab的左右兩個(gè)tab頁(yè)衣摩,比如我從1頁(yè)面切換到了2頁(yè)面昂验,那么3頁(yè)面的onResume也被調(diào)用了捂敌,但是3頁(yè)面其實(shí)對(duì)用戶是不可見(jiàn)的艾扮。這時(shí)候我們就需要監(jiān)聽(tīng)setUserVisibleHint來(lái)判斷到底對(duì)用戶是否可見(jiàn)。
@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
}
}
- RadioGroup就沒(méi)有同時(shí)加載左右兩個(gè)View的屬性占婉,但當(dāng)某一個(gè)RadioButton被選中時(shí)泡嘴,由不可見(jiàn)狀態(tài)轉(zhuǎn)變成可見(jiàn)狀態(tài),可以使用onHiddenChanged來(lái)判斷fragment的顯示狀態(tài)逆济。
//判斷當(dāng)前的fragment顯示狀態(tài)
@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
}
}
說(shuō)到這里酌予,是不是會(huì)覺(jué)得這么簡(jiǎn)單就實(shí)現(xiàn)了監(jiān)聽(tīng),請(qǐng)稍安勿躁奖慌,繼續(xù)往下看完抛虫。我們依然不能完全依賴setUserVisibleHint這個(gè)方法來(lái)判斷是否ViewPager中的頁(yè)面是否對(duì)用戶可見(jiàn)。因?yàn)樵摲椒ㄖ挥性贔ragment之間切換的時(shí)候被調(diào)用简僧。同理在RadioGroup中不能只使用onHiddenChanged來(lái)監(jiān)聽(tīng)某一個(gè)Fragment的顯示狀態(tài)建椰。因?yàn)檫€存在一種情況,比如我從一個(gè)Fragment A跳轉(zhuǎn)到另一個(gè)activity岛马,然后再回到這個(gè)Fragment A棉姐,那么ViewPager中的這個(gè)Fragment A的 setUserVisibleHint方法和RadioGroup中的onHiddenChange的方法是不會(huì)被調(diào)用的屠列。
那么針對(duì)這種情況,用廣播的方法實(shí)現(xiàn)監(jiān)聽(tīng)Fragment的顯示狀態(tài)伞矩,在Activity的onDestory方法中發(fā)送廣播:
@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中重寫(xiě)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時(shí) 笛洛,在onActivityCreated方法中接收到廣播就說(shuō)明當(dāng)前的Fragment處于可見(jiàn)狀態(tài)。以上方法同樣可以用于監(jiān)聽(tīng)當(dāng)前Fragment的顯示狀態(tài)來(lái)刷新數(shù)據(jù)乃坤。