2012-11-27 164 views
0

我試圖在選擇菜單項目後更改選項菜單。 這是我的嘗試:更改項目選項上的選項菜單項目

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 

    if(refresh) { 

     menu.clear(); 
     menu.add(0, Menu.FIRST, 0, "Changed item"); 

    } 

    return super.onPrepareOptionsMenu(menu); 

} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if(item.getItemId() == R.id.refresh) 
    { 
     refresh = true; 
     closeOptionsMenu(); 
     invalidateOptionsMenu(); 
     openOptionsMenu(); 
    } 
    return super.onOptionsItemSelected(item); 
} 

,但我得到:

W/InputManagerService(192): Window already focused, ignoring focus gain of:  [email protected] 

和代碼不工作.. 任何想法?

+0

LogCat顯示哪一行引發異常? – Sam

+0

這不是一個例外,它是來自InputManagerService的警告,所以我不知道哪個操作是負責的。 –

+0

所以它是。你的代碼是否工作?你只是想避免警告? – Sam

回答

1

,菜單將關閉,而不是重新打開,只有當我reclick上的菜單按鈕,我看到新的價值

我不知道反正保持選項菜單打開後一個項目已被選中,但您可以使用Handler和Runnable自動重新打開它。

創建了幾個新的字段變量:

private Handler handler = new Handler(); 
private Runnable reopenMenu = new Runnable() { 
    @Override 
    public void run() { 
     openOptionsMenu(); 
    } 
}; 

而且裏面onOptionsItemSelected()使用:

if(item.getItemId() == R.id.refresh) 
{ 
    refresh = true; 
    invalidateOptionsMenu(); // This is only necessary for changing an ActionBar 
    handler.postDelayed(reopenMenu, 100); 
} 

(請注意,我去掉了close的調用並打開菜單)
最後你應該設置refresh = false; in onPrepareOptionsMenu()因爲您只需要進行一次更改。

+0

處理程序+ Runnable的關鍵,現在它完美的工作,謝謝薩姆。 –

0

將菜單上的第二個按鈕設置爲GONE可能會更容易,然後在需要時將其可見。

MenuItem = menu.findItem(R.id.menuItem); 

MenuItem.setVisible(false); 
+0

menuItems上的可見性似乎不起作用 –

+0

查看編輯';) – Broak

+0

不工作..菜單剛剛關閉,當我點擊刷新 –