应用场景:在界面内列表或其他部件下拉刷新时,ActionBar 出现一个转圈的刷新标示动画。 

实现方式:可使用开源类库 RefreshActionItem (https://github.com/ManuelPeinado/RefreshActionItem),RefreshActionItem 还支持一些扩展功能,功能比较丰富;

如果只需要实现一个刷新和Loading的效果,则可以使用另一种简便的实现方式:

1. 首先定义一个 Menu xml 文件, share_public.xml:


[html] 
​​view plain​​​
​​​copy​​​
​​​​​​
​​​​​





1. <?xml version="1.0" encoding="utf-8"?>
2. <menu xmlns:android="http://schemas.android.com/apk/res/android" >
3.
4. <item
5. android:id="@+id/refresh_loading"
6. android:icon="@color/transparent"
7. android:showAsAction="always"
8. android:title="刷新"/>
9.
10. </menu>



2. 然后创建一个代表刷新进度的自定义 ProgressBar 布局文件 actionbar_indeterminate_progress.xml:



[html]
​​view plain​​​
​​​copy​​​
​​​​​​
​​​​​





1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
2. android:layout_height="wrap_content"
3. android:layout_width="56dp"
4. android:minWidth="56dp">
5.
6. <ProgressBar android:layout_width="32dp"
7. android:layout_height="32dp"
8. android:layout_gravity="center"
9. style="?indeterminateProgressStyle" />
10. </FrameLayout>


注意,为了显示美观,上面的 宽度和高度 不同的版本和屏幕可能需要设置不一样的值,可以在不同的 dimens.xml 中设置。

3. 在 Activity 代码中,获取到该 MenuItem 并根据刷新情况来设置 ActionView:



[java]
​​view plain​​​
​​​copy​​​
​​​​​​
​​​​​





1. MenuItem mProgressMenu;
2.
3. @Override
4. public boolean onCreateOptionsMenu(Menu menu) {
5. getSupportMenuInflater().inflate(R.menu.share_public, menu);
6. mProgressMenu = menu.findItem(R.id.refresh_loading);
7. return true;
8. }
9.
10. public void setLoadingState(boolean refreshing) {
11. if (mProgressMenu != null) {
12. if (refreshing) {
13. mProgressMenu
14. .setActionView(R.layout.actionbar_indeterminate_progress);
15. true);
16. else {
17. false);
18. null);
19. }
20. }
21. }

现在,根据您的刷新逻辑,只需要调用 setRefreshActionButtonState 函数就可以启用刷新动画了。

本项目不在 ActionView 中处理 OnClick 事件,用户点击该菜单是没响应的,采用此种方式,loading状态动画只会在刷新时进行,在刷新结束后隐藏。

注:本帖系在参考地址基础上改造,本项目使用了ActionbarSherlock来兼容3.0以下的版本中的Actionbar;

参考地址使用了AppCompat作兼容,在处理添加ActionView操作上略有不同。

参考地址Read more: http://blog.chengyunfeng.com/?p=572