2012-09-06 18 views
1

很显然,对于显示/隐藏不确定的进度,你必须使用此方法:ActionBarSherlock - 不确定的进度

itemMenu.setActionView(...); 

所以:

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

什么是我不明白的是:如何将操作视图设置为空。我不想保留对MenuItem的引用,我不认为这是正确的,因为我不想承担有关OptionsMenu生命周期的任何事情。

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

回答

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); 
} 
+0

这真的有用! –

0

invalidateOptionsMenu()怎么样?那么你的onCreateOptionsMenu()可能总是将其设置为null

+0

它可以工作。你怎么看待刷新onPrepareOptionsMenu的参考? – gwa

+0

@gwa:如果你的意思是把它设置为'null'而不是'onCreateOptionsMenu()',那大概是可行的,尽管我不知道你通过这种方法获得了什么。 – CommonsWare

+0

对此仍感到困惑。我会尽力挖掘更多。谢谢 – gwa

0

我相信你可以只调用setActionView(null)对菜单项

然后刷新动作条与invalidateOptionsMenu()

0

有n如果你不想要的话,需要操作特定的菜单项。

我使用不同的方法,利用系统的不确定进度条功能(移植到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 &隐藏)。

  • 你必须将其设置为不可见
  • 您还必须创建一个福尔摩斯操作栏实例之前,这个代码将工作

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); 
} 

欲了解更多详细信息,你可以检查我的答案

0

如果您不希望保留到菜单项的引用,那么你可以简单地保持到菜单对象的引用来代替。对菜单的引用保证保持有效,直到按照文档(http://developer.android.com/reference/android/app/Activity.html#onCreateOptionsMenu(android.view.Menu))中提到的方式调用下一次onCreateOptionsMenu()

然后调用:

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

或者相反,如果使用程序兼容性:

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

无需调用invalidateOptionsMenu()