天天看点

Android之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面

感觉 android 到处都是坑,每个地方都要把人折腾半天。

今天来简单说说 android之actionbar、tabs、fragment、viewpager 实现标签页切换并缓存页面

关于他们的介绍就不多说了,网上到处都是,只说关键的部分:

我在开发的时候遇到几个疑难问题,花费大量时间处理,总结如下:

1. 关于 fragment 内部逻辑处理该写在哪个事件回调部分?

2. viewpager 页面切换动画卡顿,让我头疼了很久。

3. viewpager 中如何保存 fragment 当前视图的状态,让 tabs 页面切换后不会重新加载,这地方很坑爹

4. actionbar 中的 tab 很多时如何滚动显示

解答:

一、fragment 的事件回调:

上面的类中的 on 事件就是fragment主要处理的时间回调,注意复写父类方法时要回调执行父类同名方法,否则会出错

主要复写 oncreateview 方法,返回该 fragment 所对应的视图对象,这里可以在返回视图对象前进行一些简单的配置,但千万不要写太耗时的处理阻塞ui主线程。

另外 onactivitycreated 方法,是当 activity 的 oncreate 事件结束时的回调,此时当前的fragment对应的view已经并入到整个布局中,此时可以使用 getview() 方法获取视图对象。

其他几个事件没什么太多可说,有些我也还不是太清楚,还有些动画调用的事件。

二、切换页面卡顿问题

这个问题的产生主要可能是两方面,

1. 没有使用 viewpager 的缓存,每次切换都重新加载。

2. 加载 fragment 内部有耗时耗资源的逻辑处理。

这里主要说下第二种情况,我一开始没处理掉 缓存问题时有一个解决办法,

这里主要用到 public void onpagescrollstatechanged(int state) 页面滚动切换状态变化的事件监听

当滚动动画完全结束 case viewpager.scroll_state_idle  时再执行 fragment 的逻辑处理,这样动画就会流畅了。

但经过后来的测试发现有个很简单的解决方案,就是下面要说到的 viewpager 的缓存功能,其实很简单。

三、缓存 tabs 页面切换不重新加载数据

我在这地方折腾的最久,而且很多时候无从下手的感觉,网上搜索了很多文章都有说道保存 fragment 数据和状态,但是没有整整提到如何来保存他的当前view状态,不知道如何保存,当然实际上我还是没搞懂如何仅仅缓存 fragment 的状态,但对于 viewpager 缓存 tab 对应的 fragment 还是找到了办法,之前花了很大功夫来自己实现,后来偶然发现他居然有个自带的方法

我测试时用了 6个 listview 加载图片列表数据,切换动画也没有任何卡顿现象,非常流畅,就这么简单一句就搞定了。

配置该项后,viewpager在切换时将不会清理不可见的 fragment,不会触发 fragment 的任何事件,因此也就不会导致其重新加载。

四、actionbar 中的 tabs 

这个其实不用操作,在tabs数量超过一屏后,例如我现在设置6个宽度超过了屏幕则会变成可以横向滚动的状态,而不需要自己实现,之前不知道在这方面查了很多资料都无果,只知道可以用 tabhost 可以实现,但在actionbar 里面却又用不了,自己试了下方多个tab才发现原来会自动实现,无语。

Android之ActionBar、Tabs、Fragment、ViewPager实现标签页切换并缓存页面

还是贴上 mainactivity.class 完整代码:

继续阅读