如何在ActionBarSherlock中按下“刷新”按钮时显示“不确定进度”栏?

时间:2012-06-05 21:12:24

标签: android actionbarsherlock

如何在Indeterminate ProgressBar中按下Refresh按钮时显示ActionBarSherlock,并在刷新ViewGroup时再次显示刷新按钮?

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

我们如何显示Indeterminate ProgressBar,如下图所示enter image description here

3 个答案:

答案 0 :(得分: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> 

答案 1 :(得分:10)

以下是如何使用ActionBarSherlock对象添加此类不确定的ProgressBar :(实际上,另一个更容易,但progressBar单独显示,而不是MenuItem上方

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

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

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

2 - 通过调用:

启用不确定的ProgressBar
setSupportProgressBarIndeterminateVisibility(true);

3 - 通过调用:

禁用不确定的ProgressBar
setSupportProgressBarIndeterminateVisibility(false);

备注:查看ActionBarSherlock文件夹的示例文件夹。我在以下文件中找到了这段代码: 的 JakeWharton-ActionBarSherlock-9598f2b \样品\演示\ SRC \ COM \ actionbarsherlock \样品\演示\ IndeterminateProgress.java

答案 2 :(得分: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()方法。

希望这对某人有帮助。