2012-09-06 19 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()