2012-07-10 109 views
18

我有一個基本問題,最初隱藏的MenuItem無法切換到可見狀態。作爲一個警告,我使用ActionBarSherlock,但我想知道是否有人知道這是Android的一個已知問題,或者在調查ABS是否存在問題之前做了一些可怕的事情。代碼如下:最初隱藏MenuItem未顯示當setVisible(true)被調用

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getSupportMenuInflater(); 
    inflater.inflate(R.menu.menu_xml, menu); 

    mMenuItem = menu.findItem(R.id.menu_item); 
    mMenuItem.setVisible(false); 

    return true; 
} 

// Somewhere elsewhere 
// MenuItem is never visible after this line is executed 
mMenuItem.setVisible(true); 

我也試圖在mMenuItem分配和知名度進入到onPrepareOptionsMenu但顯示相同的行爲打電話。

謝謝!

+0

難道僅僅是MENU_ITEM:
但我由內而外onPrepareOptionMenu() {...}

private boolean mShowVisible=false; @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.menu_item).setVisible(mShowVisible); return super.onPrepareOptionsMenu(menu); } 

放置,每當你想設置可見或不只是把它作爲解決它那是不顯示,或者是整個menu_xml不顯示?因爲你正在爲menu_xml充氣,但是我沒有看到你正在使用它或將它添加到任何東西。 – Scen 2012-07-10 21:46:53

+0

你不需要附加任何東西,是嗎? MenuInflater照顧那個? – PolandSpring 2012-07-10 21:59:04

+0

我使用ABS,我能夠顯示或隱藏菜單,沒有任何問題。儘管我的menuitem是由代碼添加的,而不是由xml誇大的。嘗試添加菜單的老式方式:menu.add(...)。setIcon()。setShowAsAction(); – azgolfer 2012-07-10 22:01:26

回答

23

問題是你沒有告訴Android它需要更新菜單。這讓我堅持了最後一個小時,直到我找到一個解決方案。我不認爲這在HC之前就很明顯,因爲菜單項並不總是像HC +一樣在屏幕上可見。

您的活動,只需撥打:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
this.invalidateOptionsMenu(); 
} 

這將再次觸發對onCreateOptionsMenu()的調用事件,所以如果你進行初始化設置在該功能的可視性,你需要採取如果你想要顯示或不顯示該選項,請考慮。

+8

* supportInvalidateOptionsMenu()(他正在使用ABS) – HandlerExploit 2012-07-31 15:53:38

+0

從來沒有見過ABS,所以不能告訴你那裏的具體情況。 – 2012-07-31 18:47:40

+0

http://actionbarsherlock.com/ – HandlerExploit 2012-07-31 19:37:26

6

我有同樣的問題,我發現setVisible(true)工作時,至少有另一個MenuItem可見。我希望這可以對某人有所幫助。

+0

在我的情況下,爲了使setVisible或setEnabled可用,必須至少有* 3 *個項目可見。 – lenooh 2015-09-25 21:00:35

1

我發現,使用視圖的帖子(Runnable接口)方法調用setVisible的伎倆,所以像...

view.post(new Runnable() { 

       @Override 
       public void run() { 
        menu.findItem(id).setVisible(true); 
       } 

      }); 
1

我明白這是老問題。

mShowVisible = true; // or false 
invalidateOptionMenu();