Fragment使用最多的地方应该就是ViewPager和TabLayout结合,实现类似微信既可以点击也可以左右滑动进行切换页面。或者使用Drawerlayout侧栏通过FragmentTransaction.add()、show()、hide();实现类似最新版Gmail侧栏点击切换。
在实际开发中,考虑性能和体验等方面,需要在页面可见时,再加载数据。这样就有两种情况:1,在页面第一次可见时,加载数据,往后再次进入到该页面,需要手动刷新重新获取数据;2,无论何时,只要页面可见,都自动刷新加载数据。如下图所示:
第一种情况:
第二种情况:
一,Viewpager+Fragment
这种模式下,是通过方法setUserVisibleHint进行控制fragment是否可见。其中,要调用mViewPager.setOffscreenPageLimit(2); 缓存两个页面,防止切换时销毁fragment
/** * viewpager切换时调用,而且是在onCreateView之前调用 * @param isVisibleToUser true:用户可见 */ @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { isVisible = true; onVisible(); } else { isVisible = false; onInVisible(); } }
private void onVisible() { if (isFirst && isVisible) { onLazyLoad(); // isFirst = false; // 控制fragment可见时,是否自动加载数据。 } } /** * fragment可见时再加载数据 */ public abstract void onLazyLoad();
其中的onLazyLoad方法在子类实现数据的加载。
二,FragmentTransaction.show(fragment)
这种情况和上面的有所不同,调用的方法是onHiddenChanged。
/** * 使用add(), hide(),show()添加fragment时 * 刚开始add()时,当前fragment会调用该方法,但是目标fragment不会调用; * 所以先add()所有fragment,即先初始化控件,但不初始化数据。 * * @param hidden */ @Override public void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (!hidden) { isVisible = true; onVisible(); } else { isVisible = false; onInVisible(); } }
好了,源码地址https://github.com/XYScience/DelayFragment
本人水平有限, 如有错误, 欢迎指正, 以免误导他人