ActionBar中的ProgressBar,例如带有Refresh的GMail应用程序

g12*_*23k 23 gmail android tablet android-3.0-honeycomb progress-bar

我想和Honeycomb平板电脑上的GMail应用程序做同样的事情.单击"刷新"按钮时,图标将替换为ProgressBar.我怎样才能做到这一点?

谢谢

ada*_*amp 25

Gmail使用操作视图执行此操作以实现"刷新进行中"状态.使用标准操作按钮/ onMenuItemSelected路径调用刷新.

进入刷新状态时,将刷新MenuItem的操作视图设置为ProgressBar.(以编程方式创建,从布局中扩展它,在CommonsWare建议的菜单xml中使用actionLayout,无论您喜欢什么.)当您退出刷新状态时,将操作视图设置回null,同时保持对它的引用,以便您可以设置下次刷新时它会再次返回.在菜单膨胀后,您可以挂起对MenuItem的引用,稍后对其进行的更改将反映在操作栏中.

与使用全时操作视图和自己管理状态更改的其他详细信息相比,此方法具有一些优势.操作视图完全替换菜单项的生成的操作按钮,有效地阻止用户在刷新已经进行时发送通常的onMenuItemSelected事件以进行刷新.少处理一下,动作视图可以保持完全非交互.

您可以使用API​​ 14+中的ActionProvider做一些聪明的事情,以便将整个过程封装得更多,但上述结果非常简单.


Iva*_* G. 25

好吧,我尝试过Cailean的建议,但它对我不起作用.每当我想将不确定的进度恢复到原始按钮时,它就变得无法点击,我使用此布局进行处理

(actionbar_refresh_progress.xml)

<?xml version="1.0" encoding="utf-8"?>
<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="32dp"
             android:layout_height="32dp"
             android:layout_gravity="center"/>
Run Code Online (Sandbox Code Playgroud)

这一个恢复到按钮

(actionbar_refresh_button.xml)

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
           android:src="@drawable/ic_menu_refresh_holo_light"
           android:layout_height="wrap_content"
           android:layout_width="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)

我的代码是:

private void setRefreshing(boolean refreshing) {
        this.refreshing = refreshing;
        if(refreshMenuItem == null) return;
        View refreshView;
        LayoutInflater inflater = (LayoutInflater)getActionBar().getThemedContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(refreshing)
            refreshView = inflater.inflate(R.layout.actionbar_refresh_progress, null);
        else
            refreshView = inflater.inflate(R.layout.actionbar_refresh_button, null);

        refreshMenuItem.setActionView(refreshView);
    }
Run Code Online (Sandbox Code Playgroud)

浏览Google IO应用的来源后,尤其是此文件:http://code.google.com/p/iosched/source/browse/android/src/com/google/android/apps/iosched/ui/HomeActivity. java的我发现了另一个更简单的方法.

现在我只需要第一个带有进度的布局,工作方法如下所示:

private void setRefreshing(boolean refreshing) {
    this.refreshing = refreshing;
    if(refreshMenuItem == null) return;

    if(refreshing)
        refreshMenuItem.setActionView(R.layout.actionbar_refresh_progress);
    else
        refreshMenuItem.setActionView(null);
}
Run Code Online (Sandbox Code Playgroud)

菜单项定义:

<item android:id="@+id/mail_refresh"
      android:title="Refresh"
      android:icon="@drawable/ic_menu_refresh_holo_light"
      android:showAsAction="always"/>
Run Code Online (Sandbox Code Playgroud)

我希望有人觉得这很有用.

  • actionbar_refresh_progress的xml代码没有正确地将ProgressBar作为刷新图标的中心.然而,按照链接到谷歌IO应用程序并直接拉动他们的actionbar_indeterminate_progress.xml,它可以创造奇迹!https://code.google.com/p/iosched/source/browse/android/res/layout/actionbar_indeterminate_progress.xml (7认同)

小智 8

假设您已经设置了菜单项,则需要先创建两个新布局.一个包含普通刷新按钮的布局,另一个包含进度条.

获得后,调用以下代码在两个布局之间切换.您需要确定何时需要再次调用它才能将其切换回刷新图标.

private void doRefresh(Boolean refreshing, MenuItem menuItem)
{
    View refreshView;
    LayoutInflater inflater = (LayoutInflater) getActionBar().getThemedContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if(refreshing)
        refreshView = inflater.inflate(R.layout.actionbar_indeterminate_progress, null);
    else
        refreshView = inflater.inflate(R.layout.refresh_icon, null);

    menuItem.setActionView(refreshView);

}
Run Code Online (Sandbox Code Playgroud)