2011-10-28 40 views
2

我需要: 使用「登錄」選項創建選項菜單,當用戶登錄時需要更改爲「註銷」,當用戶再次點擊菜單按鈕時使用ActionBarSherlock時,選項菜單不會動態更新

當使用純SDK使用兼容性庫V4 然而,當使用ActionBarSherlock當菜單中onPrepareOptionsMenu不會更新我可以改變onPrepareOptionsMenu 同一作品的菜單選項;它仍然被調用,但顯示的菜單不會改變。

有沒有人有解決這個問題?

回答

3

是的,這是一個討厭的ABS錯誤。 你能解決這個問題是這樣的: 在FragmentActivity.java找到onPrepareOptionsMenu(android.view.Menu菜單)方法和註釋掉或刪除

if (mOptionsMenuInvalidated) { 

線及其相應的右括號,所以這一塊得到執行,每次。 如果您正在使用FragmentMapActivity活動,請執行相同操作。

+10

也許你應該用類似這樣的方式給開發者發郵件...... –

+0

這似乎在ABS中是固定的4.記得在你的onTabSelected()中調用invalidateOptionsMenu()來告訴系統啓動onPrepareOptionsMenu() – larham1

+0

因爲這個是一個比較老的問題,我會用@ larham1建議去,並假定它是固定的。 – Denis

1

此線程有點舊,我無法應用建議的修復(或找到更好的修復)。我正在使用ActionBarSherlock 4.2,但在ICS設備上登錄選項菜單是疊加層時,仍然遇到問題:我無法弄清楚如何在登錄活動關閉後強制使菜單失效(並且應用程序已經確定登錄狀態已更改)。

我解決了帶有標誌的問題,使菜單onResume失效。我覺得使用國旗是一種黑客行爲,但它比每一份履歷上的無效都好。

@Override 
protected void onResume() 
{ 
    if (checkLoginState == Boolean.TRUE) 
    { 
     invalidateOptionsMenu(); 
     checkLoginState = Boolean.FALSE; 
    } 
    super.onResume(); 
} 

然後在onOptionsItemSelected我設置的標誌:

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    // Handle item selection 
    switch (item.getItemId()) 
    { 
     case R.id.actionbar_settings_signin_out: 
      if (isUserLoggedIn() == Boolean.TRUE) 
      { 
       logout(); 
       validateOptionsMenu(); 
      } 
      else 
      { 
       // set the flag so that on resume we update the options menu 
       checkLoginState = Boolean.TRUE; 
       startSignInActivity(); 
      } 
      return true; 

這是爲我工作,但我很好奇聽到的話,其他人有更好的方法解決它。

+0

這很有用,謝謝! – jasonhudgins