zoukankan      html  css  js  c++  java
  • 在 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"?>
     
        <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


  • 相关阅读:
    Jsp+Servlet实现文件上传下载——前台页面开发
    【软考】——原码、反码、补码、移码
    【NCRE】——c# 给PPT判分
    [RN] React Native Image 实现placeholder占位图
    [PHP] Elasticsearch 6.4.2 的安装和使用
    [RN] 使用 Genymotion 导致 ” Genymotion 已连接,但无法访问互联网 “ 的错误
    [RN] React Native 分享弹窗 ShareAlertDialog
    [RN] React Navigation 使用中遇到的显示 问题 汇总
    [RN] React Native Fetch请求设置超时
    [RN] React Native 滚动跳转到指定位置
  • 原文地址:https://www.cnblogs.com/krislight1105/p/3748380.html
Copyright © 2011-2022 走看看