12

如何Indeterminate ProgressBarRefresh按下ActionBarSherlock按钮时显示并在刷新 ViewGroup 时再次显示刷新按钮?

更新 1: 我在这里有一个不完整的答案。我正在悬赏问题,以便更多的开发人员可以帮助建立一个很好的答案,这对未来的其他人有用。

我们如何显示Indeterminate ProgressBar如下图所示的在此处输入图像描述

4

3 回答 3

31

似乎 ActionBarSherlock 没有提供为刷新 MenuItem 设置动画的特定方法。

您可以做的(通过使用经典的 android API)是使用该setActionView(int resId)方法并提供带有 ProgressBar 的布局的 id。

在您的刷新操作开始时,只需调用:

item.setActionView(R.layout.refresh_menuitem);

当您的刷新操作完成时调用:

item.setActionView(null);

这是您的布局文件refresh_menuitem.xml可以具有的示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:addStatesFromChildren="true"
              android:focusable="true"
              android:paddingLeft="4dp"
              android:paddingRight="4dp"
              android:gravity="center"
              style="?attr/actionButtonStyle">
    <ProgressBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="true"
            style="@android:style/Widget.ProgressBar.Small"/>
</LinearLayout> 
于 2012-06-06T06:43:19.010 回答
10

这是您如何使用对象添加这种不确定 ProgressBar 的方法ActionBarSherlock:(实际上,另一个更容易,但 progressBar 单独显示,而不是在 a 上方MenuItem

1 - 将此行放在 setContentView() 调用之前的 onCreate() 方法中:

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

-> 此行指定您将使用不确定的 ProgressBar 函数。

2 - 通过调用启用不确定的 ProgressBar:

setSupportProgressBarIndeterminateVisibility(true);

3 - 通过调用禁用不确定的 ProgressBar:

setSupportProgressBarIndeterminateVisibility(false);

备注:查看 ActionBarSherlock 文件夹的示例文件夹。我在以下文件中找到了此代码: JakeWharton-ActionBarSherlock-9598f2b\samples\demos\src\com\actionbarsherlock\sample\demos\IndeterminateProgress.java

于 2012-06-08T14:19:49.947 回答
2

这是一个完整的代码:

private static final int menuItemIdRefresh = 10; //class constant
private boolean refresh;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuItem refreshItem = menu.add(0, menuItemIdRefresh, 0,
            getString(R.string.action_refresh)).setShowAsActionFlags(
            MenuItem.SHOW_AS_ACTION_ALWAYS);

    if (isRefreshing) {
        refreshItem.setActionView(R.layout.indeterminate_progress);
    } else {
        refreshItem.setActionView(null);
        refreshItem.setIcon(R.drawable.ic_refresh);
    }

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case menuItemIdRefresh: {
            //the user has pressed the refresh button
        if (!isRefreshing) {
            isRefreshing = true;
            new RefreshMyViewAsyncTask().execute("");
        }
    }
        break;

    default:
        break;
    }

    return false;
}

最后一点,为了使上述代码正常工作,您还需要调用 supportInvalidateOptionsMenu()。您可以将其添加到 RefreshMyViewAsyncTask 的 onPreExecute() 方法。

希望这对某人有所帮助。

于 2013-06-11T17:57:08.877 回答