2012-07-10 22 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場合、私が原因でアクションバーのない古いAndroidのバージョンとの互換性の問題をチェックします。すべてのバージョンで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のあなたのIDは何ですか? (ridid [theid])?私の実装では、ローカル変数にMenuItemを格納し、これを使用してgetItemId()を使用します。 –

    +0

    私の更新された答えを見てください。 –

    4

    私はいつもFredrik Sundmyrrのソリューションで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); 
        } 
    

    歓声、 ポール

    関連する問題