背景
最近在开发中遇到了一个问题,我们的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的显示状态来刷新数据