2010-08-18 20 views
4

我需要在前一個屏幕(Activity)返回時啓用MenuItem。Android - 通過代碼啓用MenuItems

我嘗試這樣的代碼:

... ((菜單項)findViewById(R.id.menu_how))的setEnabled(真); ...

但啓動了空指針異常。

順便說一句,menu_how在xml中設置爲false;並且代碼是onActivityResult(int requestCode,int resultCode,Intent數據)調用的一部分。

回答

1

你在哪兒打這個電話? (對不起,沒有仔細閱讀)我認爲你需要在菜單充值後調用它(通常在OnCreateOptionsMenu中)。爲此,您可以在其他Activity返回時將變量設置爲true,然後在調用inflater.inflate之後在OnCreateOptionsMenu中執行((MenuItem)findViewById(R.id.menu_how)).setEnabled(mMyBooleanField)

編輯:在代碼中做到這一點,它可能是這個樣子:

在類的頂部(連同所有其他類成員):
Boolean mEnableMenuItem = false;

在OnCreateOptionsMenu:
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.options_main, menu); ((MenuItem)findViewById(R.id.menu_how)).setEnabled(mEnableMenuItem);

在OnActivityResult:
mEnableMenuItem = true;

+0

感謝您的回答,但是,我想要做的是根據某些條件啓用我的MenuItem。這個條件是從另一個activity獲得的,所以我在onActivityResult(int requestCode,int resultCode,Intent data)代碼中包含了((MenuItem)findViewById(R.id.menu_how))。setEnabled = true。這導致空指針異常。 – mauricio 2010-08-19 09:29:56

+0

這就是上述答案的成就。事情是,我不認爲你可以直接在onActivityResult中設置它,你需要使用變量間接設置它。我將通過代碼實現更新我的答案,使其更具體一些。 – QRohlf 2010-08-19 16:08:10

6

我發現在Android開發site的東西,可能是有益的(尋找節「在運行時更改菜單項」)

它說,僅在創建該活動的菜單中onCreateOptionsMenu()法進行燒結,和它發生在這個活動開始時。因此,如果您想在菜單/活動創建後更改菜單項,則需要覆蓋onPrepareOptionsMenu()方法。搜索鏈接的全部細節。

編輯:

剛做出來,它工作正常。我使用的每個menuItem使用一個boolean var,它表示是否應該啓用此項目。這是我的代碼:使用onCreateOptionsMenu menu.findItem(R.id.menu_how)並保存供以後使用的參考

/*************************************Game Menu**************************************/ 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.game_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) 
    { 
     case R.id.gm_new_game: 
      //newGame(); 
      return true; 
     case R.id.gm_stand_up: 
      //some code when "gm_stand_up" button clicked.. 
      return true; 
     case R.id.gm_forfeit: 
      //some code when "gm_forfeit" button clicked.. 
      return true; 
     case R.id.gm_surrender: 
      //some code when "gm_surrender" button clicked.. 
      return true; 
     case R.id.gm_exit_table: 
      exitTableCommand(); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    menu.findItem(R.id.gm_forfeit).setEnabled(forfeitMenuButtonIsEnabled); 
    menu.findItem(R.id.gm_surrender).setEnabled(surrenderMenuButtonIsEnabled); 
    menu.findItem(R.id.gm_new_game).setEnabled(newGameMenuButtonIsEnabled); 
    menu.findItem(R.id.gm_stand_up).setEnabled(standUpMenuButtonIsEnabled); 

    return super.onPrepareOptionsMenu(menu); 
} 
+0

感謝您的回答。我會試試看。 – mauricio 2011-04-13 06:24:30

6

嘗試。

這應該與enabled正常工作,但是,我發現設置一個菜單項在XML中不可見意味着您不能以編程方式顯示/隱藏它。

0

請您的活動菜單的引用:

private Menu mMenu; 

然後:

public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_note, menu); 
     mMenu = menu; 
     return true; 
    } 

現在,在您的活動在任何地方訪問菜單項使用相似的代碼如下:

mMenu.findItem(R.id.menu_how).setVisible(false); 

mMenu.findItem(R.id.menu_how).setEnabled(true);