参考微信,使用ViewPager来显示不同的tab,每个tab是一个Fragment,
假设有3个tab,对应的fragment是FragmentA、FragmentB、FragmentC
需要实现的效果是进入后,默认先只加载FragmentA,具体滑动到了哪个Fragment,再去加载该Fragment的数据。
可以参考如下BaseLazyFragment代码:
1 /**
2 * Author: wangjie
3 * Email: tiantian.china.2@gmail.com
4 * Date: 1/23/15.
5 */
6 public class BaseLazyFragment extends BaseFragment {
7 private static final String TAG = BaseLazyFragment.class.getSimpleName();
8 private boolean isPrepared;
9
10 @Override
11 public void onActivityCreated(Bundle savedInstanceState) {
12 super.onActivityCreated(savedInstanceState);
13 initPrepare();
14 }
15
16
17 /**
18 * 第一次onResume中的调用onUserVisible避免操作与onFirstUserVisible操作重复
19 */
20 private boolean isFirstResume = true;
21
22 @Override
23 public void onResume() {
24 super.onResume();
25 if (isFirstResume) {
26 isFirstResume = false;
27 return;
28 }
29 if (getUserVisibleHint()) {
30 onUserVisible();
31 }
32 }
33
34 @Override
35 public void onPause() {
36 super.onPause();
37 if (getUserVisibleHint()) {
38 onUserInvisible();
39 }
40 }
41
42 private boolean isFirstVisible = true;
43 private boolean isFirstInvisible = true;
44
45 @Override
46 public void setUserVisibleHint(boolean isVisibleToUser) {
47 super.setUserVisibleHint(isVisibleToUser);
48 if (isVisibleToUser) {
49 if (isFirstVisible) {
50 isFirstVisible = false;
51 initPrepare();
52 } else {
53 onUserVisible();
54 }
55 } else {
56 if (isFirstInvisible) {
57 isFirstInvisible = false;
58 onFirstUserInvisible();
59 } else {
60 onUserInvisible();
61 }
62 }
63 }
64
65 public synchronized void initPrepare() {
66 if (isPrepared) {
67 onFirstUserVisible();
68 } else {
69 isPrepared = true;
70 }
71 }
72
73 /**
74 * 第一次fragment可见(进行初始化工作)
75 */
76 public void onFirstUserVisible() {
77
78 }
79
80 /**
81 * fragment可见(切换回来或者onResume)
82 */
83 public void onUserVisible() {
84
85 }
86
87 /**
88 * 第一次fragment不可见(不建议在此处理事件)
89 */
90 public void onFirstUserInvisible() {
91
92 }
93
94 /**
95 * fragment不可见(切换掉或者onPause)
96 */
97 public void onUserInvisible() {
98
99 }
100
101 }
如上代码,使用setUserVisibleHint方法作为回调的依据,
暴露出来让子类使用的新的生命周期方法为:
- onFirstUserVisible();
第一次fragment可见(进行初始化工作)
- onUserVisible();
fragment可见(切换回来或者onResume)
- onFirstUserInvisible();
第一次fragment不可见(不建议在此处理事件)
- onUserInvisible();
fragment不可见(切换掉或者onPause)
具体的效果是:
1. 首先加载ViewPager,回调FragmentA(第一个默认呈现的Fragment)的onFirstUserVisible(),可以在这里进行FragmentA的初始化工作,其他Fragment保持不变。
2. 用户从FragmentA滑动到FragmentB,回调FragmentA的onUserInvisible()、FragmentB的onFirstUserVisible()(因为第一次切换到FragmentB,可以在这里进行初始化工作)。
3. 用户从FragmentB滑动到FragmentC,回调FragmentB的onUserInvisible()、FragmentC的onFirstUserVisible()(因为第一次切换到FragmentC,可以在这里进行初始化工作)。
4. 用户从FragmentC滑动到FragmentB,回调FragmentC的onUserInvisible()、FragmentB的onUserVisible()(因为FragmentB之前已经被加载过)。
5. 因为到此为止,suoyou的Fragment都已经被加载过了,所以以后这3个Fragment互相任意切换,只会回调原来Fragment的onUserInvisible()和切换后的Fragment的onUserVisible()。
6. 用户处于FragmentB,关闭手机屏幕,回调FragmentB的onUserInvisible()。
7.用户处于FragmentB,手机屏幕处关闭状态,然后开启手机屏幕解锁,只回调FragmentB的onUserVisible()。
分享到:
相关推荐
仿微信动态加载Fragment
使用Fragment实现仿微信界面的实现
类似微信qq的fragment加上tab的集合,包含了小红点,还加入了沉浸栏的效果,好用到飞起,结构一点都不复杂
使用ViewPager+Fragment+RadioGroup实现类似微信主界面
用ViewPager + RadioGroup实现的仿微信界面
Fragment和ViewPager组合实现微信界面滑动切换Activity模仿
ViewPager+RadioGroup+Fragment实现类似微信的底部导航
Android Studio使用ViewPager+Fragment实现仿微信滑动切换界面
Android ViewPager和Fragment实现仿微信导航界面及滑动效果
模仿微信主界面跳转和Fragment滑动效果,要做类似于仿微信操作的可以学习一下,适合新手!
简单demo实现类似微信导航栏RedioGroup+Viewpager, 4 个 tab 的导航按钮,可以切换不同的页面,这里页面使用了 ViewPager + Fragment 的组合,实现了滑动的页面效果
今天起床,拿起手机开机第一时间当然是打开微信了,左右滑动Viewpager,发现它使用了一种叫惰性加载,或者说懒加载(lazy-loading)的方式加载Viewpager中的Fragment。效果如图: 什么是lazy-loading呢?顾名思义...
简单demo实现类似微信导航栏RedioGroup+Viewpager, 4 个 tab 的导航按钮,可以切换不同的页面,这里页面使用了 ViewPager + Fragment 的组合,实现了滑动的页面效果
话说最近项目遇到点问题,就是类似网易的那种tab切换fragment,但是每次fagment都会遇到下面几个问题:要么这些fragment同时初始化,要么就是刚加载好的fragment滑出界面再滑回来又重新加载了。如果你遇到这样的问题...
网有不少的例子,但是要么是像微信一样可是没有使用Fragment实现,要么是只实现了一个很简单的切换,没有下面的菜单页。这个例子有实现了,我觉得暂时够我用了 ---------------------------------------- 使用了...
Fragment框架(类似QQ、微信)主界面
VIewPager+Fragment实现仿微信界面+(BadgView)数字提醒
该工程实现了利用Fragment实现微信Tab主界面的功能,可以点击底部按钮进行中间内容区域的变化,效果可以参考微信
viewpager+fragment左右滑动实现动态加载数据。动态刷新fragment