2012-07-10 4 views
7

ActionBarSherlock-4.1.0-0을 사용 중이고 하드웨어 메뉴 버튼을 사용하여 내 하위 메뉴를 작업 표시 줄에 열고 싶습니다. 업데이트 계획을 세우고 있으며 이전 버전에서는 "정상적인"메뉴를 사용했습니다. 사용자가 새로운 디자인에 익숙해 지도록 돕고 싶습니다. 나는 하위 메뉴와 메인 메뉴 있어요 :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); 
} 

합니다. 나는이 내가 귀하의 경우

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); 
} 

에서 같은 것 상상 얼마나 당신이, 환호, 폴

답변

11

나는 안드로이드 액션 바와 프레데릭에서이 솔루션을 시도하고 나는 하위 메뉴가 열리고 즉시 종료 문제로 실행 : 여기 내 솔루션입니다. 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 경우 때문에 액션 바없이 이전 안드로이드 버전과의 호환성 문제로 확인합니까 :

여기 내 코드입니다. 모든 버전에 대해 ActionBarSherlock을 사용하는 경우에는 별다른 문제가 아닙니다.

+4

ACTION_UP이 아니라 ACTION_UP이어야합니다. – kolobok

4

을 도와 수 있기를 바랍니다 약식 :

  • 메뉴를 로컬 변수에 저장하십시오.
  • performIdentifierAction 방법 희망

이 작동을 호출하는 그 변수를 사용하여 하위 메뉴

  • 를 찾기 위해 그 변수를 사용합니다.

  • +0

    지원해 주셔서 감사합니다.하지만 솔루션을 구현할 때 주 메뉴 mainMenu.performIdentifierAction (subMenu.getItem(). getItemId(), 0);에서 java.lang.NullPointerException이 발생합니다. subMenu 객체는 null입니까? – Spipau

    +0

    아이디어는 하위 메뉴의 항목 ID를 찾아서 사용해야한다는 것입니다. 당신의 하위 메뉴 ID는 무엇입니까? (theid [theid])? 내 구현에서 할 일은 로컬 var에 MenuItem을 저장하고이를 사용하여 getItemId()를 사용하는 것입니다. –

    +0

    업데이트 된 답변보기 –

    4

    나는 Fredrik Sundmyhr의 솔루션으로 항상 NullPointerException을 얻었고 몇 가지를 변경했다.

    @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); 
        } 
    

    환호, 폴