ActionBarSherlock - 不确定进度

时间:2012-09-06 17:43:42

标签: android android-actionbar

很明显,要显示/隐藏不确定的进度,您必须使用此方法:

itemMenu.setActionView(...);

所以:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menu_refresh:
            item.setActionView(R.layout.indeterminate_progress_action);
            runAsyncTask();
    ...
    }
}

我不清楚的是:如何将操作视图设置回null。我不想保留对MenuItem的引用,我认为它不正确,因为我不想假设有关OptionsMenu生命周期的任何内容。

如何在onPostExecute上将操作视图设置为null?

5 个答案:

答案 0 :(得分:5)

我这样做:

refresh = false; // the future state of your indeterminate progress
invalidateOptionsMenu(); // trigger the recreation of the menu and call onCreateOptionsMenu(Menu)

然后在你的onCreateOptionsMenu(菜单)方法中:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
    super.onCreateOptionsMenu(menu, inflater);

    MenuItem refreshItem = menu.add(Menu.NONE, R.id.action_bar_refresh, 1, "Refresh");
    refreshItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

    if(refresh)
        refreshItem.setActionView(R.layout.indeterminate_progress_action);
    else
        refreshItem.setIcon(R.drawable.ic_menu_refresh);
}

答案 1 :(得分:0)

invalidateOptionsMenu()怎么样?您的onCreateOptionsMenu()可能会始终将其设置为null,然后。

答案 2 :(得分:0)

我相信您可以在该MenuItem上调用setActionView(null)

然后使用invalidateOptionsMenu()

刷新ActionBar

答案 3 :(得分:0)

如果您不愿意,则无​​需操作特定的菜单项。

我使用了一种不同的方法来利用系统的不确定进度条功能(移植到ActionBarSherlock)。我在这里解释一下,为未来的读者提供更多选择,以便以最适合他们的方式使用。


我的基本片段有一个方法,我打电话来打开我的加载UI&关闭。这是一个精简版:

private void setLoading(final boolean isLoading)
{
    final SherlockFragmentActivity sherlockActivity = getSherlockActivity();
    sherlockActivity.runOnUiThread(new Runnable()
    {
        public void run()
        {
            // show loading progress bar
            sherlockActivity
                .setSupportProgressBarIndeterminateVisibility(isLoading);

            // hide the rest of the menu
            setMenuVisibility(!isLoading);
        }
    });
}

为此,您的活动必须配置为使用正确的样式 - 请使用SherlockFragmentActivity.onCreate()方法调用此方法:

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

最后的诀窍是,在HoneyComb之前的设备上,这会导致进度条默认显示(而不是默认隐藏在HC&上面)。

  • 您必须将其设置为隐身
  • 您必须在此代码生效之前创建一个Sherlock Action Bar实例

onCreate()因此变为:

protected void onCreate(Bundle arg0)
{
    super.onCreate(arg0);

    // allow window to show progress spinner in the action bar
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    getSupportActionBar();
    setSupportProgressBarIndeterminateVisibility(false); 
}

有关详细信息,请查看我的答案

答案 4 :(得分:0)

如果您不想保留对菜单项的引用,则可以简单地保留对Menu对象的引用。对文档的引用保证在下次onCreateOptionsMenu()被调用之前保持有效,如文档(http://developer.android.com/reference/android/app/Activity.html#onCreateOptionsMenu(android.view.Menu))中所述。

然后致电:

MenuItem menuItem = mMenu.findItem(R.id.favourite_payment);
menuItem.setActionView(null);

或者,如果使用AppCompat:

MenuItem menuItem = mMenu.findItem(R.id.favourite_payment);
MenuItemCompat.setActionView(menuItem, null);

无需拨打invalidateOptionsMenu()