前言:项目中经常会碰到底部几个tab标签,然后中间一块是内容,一般都是fragment+RadioButton来实现该需求,但是,众所周知,附近相邻的fragment会同时触发,至于缘由呢,百度上面可以找到。下面只分享我的个人的解决方案,但是**注意的是,该解决方案没涉及到fragment的嵌套,没涉及到屏幕横竖屏切换fragment的销毁**。
一般的fragment+RadioButton的解决方案:
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (view == null) {
view = inflater.inflate(R.layout.fragment_info, container, false);
initToolbar();
init(view);
isPrepared = true;
}
ViewGroup parent = (ViewGroup) view.getParent();
if (parent != null) {
parent.removeView(view);
}
initValue();
ButterKnife.bind(this, view);
return view;
}
上面是初始化View,判断parent是否为空的缘由也请自行百度。
其实最主要的方法如下:
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!isPrepared) {
return;
}
if (!hidden && this.isAdded()) {
LogUtil.e(TAG, "onHiddenChanged----");
loadData();
}
}
@Override
public void onResume() {
super.onResume();
if (!this.isHidden() && this.isAdded() && !isFromActivityResultRefresh) {
LogUtil.e(TAG, "onResume----");
loadData();
}
}
有很多人都在用懒加载并且还重写了setUserVisibleHint方法,其实我打印了一下,感觉实现不了,setUserVisibleHint方法配合能切换的fragment才有效果,例如tabLayout+fragment,或者viewpager+fragment才起作用。so,下面附上tabLayout+fragment实现滑动到某fragment,该fragment才加载数据的个人解决方案:
public abstract class LazyFragment extends BaseFragment {
/**
* Fragment当前状态是否可见
*/
protected boolean isVisible;
/**
* 在这里实现Fragment数据的缓加载(该方法搭配ViewPager才能生效).
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
isVisible = true;
onVisible();
} else {
isVisible = false;
onInvisible();
}
}
/**
* 可见
*/
protected void onVisible() {
lazyLoad();
}
protected abstract void lazyLoad();
/**
* 不可见
*/
protected void onInvisible() {
}
}
上面的代码忘了是哪位仁兄写的了,先感谢他。另外,每个fragment的onCreateView中的初始化也跟上面代码一致。最后附上重头戏:
@Override
protected void lazyLoad() {
if (!isPrepared || !isVisible) {
return;
}
//填充各控件的数据
loadData();
LogUtil.e(TAG, "lazyLoad----" + isVisible);
}
@Override
public void onResume() {
super.onResume();
if (isVisible && this.isAdded() && !isFromActivityResultRefresh) {
LogUtil.e(TAG, "onResume----");
loadData();
}
}
嗯,主要实现方法就是上面那些了。下面附上demo下载链接:fragment+RadioButton
TabLayout+fragment