2012-07-10 96 views
7

我使用的是ActionBarSherlock-4.1.0-0,我想用硬件菜單按鈕在Actionbar中打開我的子菜單。我正在計劃更新,而在舊版本中,我使用了「正常」菜單。我想幫助用戶適應新的設計。 我得到了子菜單和主菜單:ActionBarSherlock:使用菜單按鈕打開子菜單

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater i = getSupportMenuInflater(); 
    i.inflate(R.menu.main_menu, menu); 
    SubMenu subMenu = (SubMenu) menu.findItem(R.id.actionbar_submenu); 
    Menu mainMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

和我有一個聽者硬件菜單按鈕:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(event.getAction() == KeyEvent.ACTION_DOWN){ 
     switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      // TODO: expand submenu from actionbar 
      return true; 

     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 

我無法找到一個方法或其他任何來電。我希望你能幫助我, 歡呼聲, 保羅

回答

11

我試着從弗雷德裏克這個解決方案與Android動作條,我碰上的子菜單打開,並立即關閉問題。改爲onKeyUp解決了這個問題。

這裏是我的代碼:

@Override 
public boolean onKeyUp(int keyCode, KeyEvent event) { 
    if(keyCode == KeyEvent.KEYCODE_MENU){ 
     if (event.getAction() == KeyEvent.ACTION_DOWN && optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null) 
     { 
      Log.i(TAG, "performIdentifierAction"); 
      optionsMenu.performIdentifierAction(R.id.sub_menu, 0); 
      return true; 
     } 
    } 
    return super.onKeyUp(keyCode, event); 
} 

我做檢查,如果optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null因爲與舊的Android版本沒有動作條的兼容性問題。如果您對所有版本使用ActionBarSherlock,這不是無關緊要的。

+4

它應該是ACTION_UP,而不是ACTION_DOWN – kolobok 2013-04-16 13:10:22

4

這是我如何解決這個問題

mainMenu.performIdentifierAction(id_of_menu_item, 0); 

所以你的情況我會想象它會是這樣

private Menu mainMenu; // local variable for menu 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater i = getSupportMenuInflater(); 
    i.inflate(R.menu.main_menu, menu); 
    SubMenu subMenu = (SubMenu) menu.findItem(R.id.actionbar_submenu); 
    mainMenu = menu; // store the menu in an local variable 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if(event.getAction() == KeyEvent.ACTION_DOWN){ 
     switch(keyCode) { 
     case KeyEvent.KEYCODE_MENU: 
      SubMenu subMenu = (SubMenu) mainMenu.findItem(R.id.actionbar_submenu); 
      mainMenu.performIdentifierAction(subMenu.getItem().getItemId(), 0); 

      return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); 
} 

在簡稱:

  • 將菜單存儲在本地變量中
  • 使用該變量來尋找子菜單
  • 使用該變量調用performIdentifierAction方法

希望這會工作。

+0

感謝您的支持,但是當我實現您的解決方案時,然後我在mainMenu.performIdentifierAction(subMenu.getItem()。getItemId(),0);處得到java.lang.NullPointerException異常。 subMenu對象爲null,有何建議? – Spipau 2012-07-30 17:47:12

+0

這個想法是,你需要找到你的子菜單的項目ID並使用它。你的子菜單ID是什麼? (r.id. [theid])?我在我的實現中做的是將MenuItem存儲在本地var中,並使用它執行:getItemId()。 – 2012-07-30 18:59:31

+0

查看我的更新回答。 – 2012-07-30 19:08:59

4

我總是得到一個NullPointerException與Fredrik Sundmyhr的解決方案,然後我改變了一些東西,它的工作。這裏是我的解決方案:

@Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     if(event.getAction() == KeyEvent.ACTION_UP){ 
      switch(keyCode) 
      { 
      case KeyEvent.KEYCODE_MENU: 
       SubMenu subMenu = mainMenu.getItem(2).getSubMenu(); 
       mainMenu.performIdentifierAction(subMenu.getItem().getItemId(), 0); 

       return true; 
      } 
     } 
     return super.onKeyUp(keyCode, event); 
    } 

歡呼聲, 保羅