在 ActionBar 添加刷新按钮

在以前版本的 Gmail 应用中,ActionBar 上有个刷新菜单,点击一下刷新菜单变成一个转圈的刷新标示动画图片。 之前实现该功能的时候都是使用一个类库 RefreshActionItem 来实现的。RefreshActionItem 还支持一些扩展功能,功能比较丰富。

今天无意中又发现一个简单的实现方式。如果您只需要一个刷新的效果,则可以考虑这种方法, 实现方式如下:

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

1
2
3
4
5
6
7
8
9
10
11
<? xml version = "1.0" encoding = "utf-8" ?>
< menu xmlns:android = "http://schemas.android.com/apk/res/android" >
 
     < item
         android:id = "@id/menu_refresh"
         android:icon = "@drawable/icon_refresh"
         android:orderInCategory = "100"
         android:showAsAction = "always"
         android:title = "@string/action_refresh" />
 
</ menu >


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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private Menu mOptionsMenu;
 
@Override
public boolean onCreateOptionsMenu(Menu menu) {
   mOptionsMenu = menu;
   // Inflate the menu; this adds items to the action bar if it is present.
   getMenuInflater().inflate(R.menu.main_content, menu);
   return true ;
}
 
public void setRefreshActionButtonState( boolean refreshing) {
   if (mOptionsMenu == null ) {
     return ;
   }
 
   final MenuItem refreshItem = mOptionsMenu.findItem(R.id.menu_refresh);
   if (refreshItem != null ) {
     if (refreshing) {
       MenuItemCompat.setActionView(refreshItem, R.layout.actionbar_indeterminate_progress);
     } else {
       MenuItemCompat.setActionView(refreshItem, null );
     }
   }
}

这里为了兼容 AppCompat (android 3.0 之前的版本)用了  MenuItemCompat 来设置 ActionView。

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

这种方式,值得一提的是, 如果你设置了 ActionView,则就是一个自定义 ActionItem,如果在 ActionView 中你不处理 OnClick 事件,则用户点击该菜单是没响应的,这种行为刚好是应用需要的行为。


本文出自 云在千峰,转载时请注明出处及相应链接。

本文永久链接: http://blog.chengyunfeng.com/?p=572


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值