2012-07-10 40 views
7

Tôi đang sử dụng ActionBarSherlock-4.1.0-0 và tôi muốn mở menu con của mình trong Thanh tác vụ bằng nút trình đơn phần cứng. Tôi đang lên kế hoạch cập nhật và trong phiên bản cũ của mình, tôi đã sử dụng menu "bình thường". Tôi muốn giúp người dùng quen với thiết kế mới. tôi có các menu con và chính-menu:ActionBarSherlock: menu con đang mở với nút 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); 
    Menu mainMenu = menu; 
    return super.onCreateOptionsMenu(menu); 
} 

và tôi đã nhận một listner vào nút menu phần cứng:

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

tôi không thể tìm thấy một phương pháp hay bất cứ thứ gì để gọi. Tôi hy vọng bạn có thể giúp tôi, cổ vũ, Paul

Trả lời

11

tôi cố gắng giải pháp này từ Frederik với actionbar android và tôi chạy vào vấn đề mà các menu con sẽ mở ra và đóng lại ngay lập tức. Thay đổi thành onKeyUp đã giải quyết được vấn đề này.

Đây là mã của tôi:

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

tôi kiểm tra xem optionsMenu != null && optionsMenu.findItem(R.id.sub_menu) != null vì vấn đề tương thích với các phiên bản Android cũ hơn mà không actionbar. Điều này không cần thiết nếu bạn sử dụng ActionBarSherlock cho tất cả các phiên bản.

+4

Nó phải là ACTION_UP, không phải ACTION_DOWN – kolobok

4

Đây là cách tôi giải quyết vấn đề này

mainMenu.performIdentifierAction(id_of_menu_item, 0); 

Vì vậy, trong trường hợp của bạn tôi sẽ tưởng tượng nó sẽ như thế này

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

Trong ngắn:

  • Lưu menu trong biến cục bộ
  • Sử dụng biến đó để tìm kiếm các tiểu đơn
  • Sử dụng biến mà để gọi performIdentifierAction phương pháp

Hy vọng rằng điều này sẽ làm việc.

+0

Cảm ơn sự hỗ trợ của bạn, nhưng khi tôi triển khai giải pháp của bạn, sau đó tôi nhận được một java.lang.NullPointerException tại dòng mainMenu.performIdentifierAction (subMenu.getItem(). GetItemId(), 0) ;. Đối tượng subMenu là null, lời khuyên nào? – Spipau

+0

Ý tưởng là bạn cần phải tìm id mục của menu con của bạn và sử dụng nó. Id của bạn là id trình đơn phụ là gì? (The r.id. [theid])? Những gì tôi làm trong việc thực hiện của tôi là lưu trữ MenuItem trong một var cục bộ và sử dụng nó để làm: getItemId(). –

+0

Xem câu trả lời cập nhật của tôi. –

4

Tôi luôn có một NullPointerException với giải pháp của Fredrik Sundmyhr, sau đó tôi đã thay đổi một vài điều và nó hoạt động. Đây là giải pháp của tôi:

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

cổ vũ, Paul

Các vấn đề liên quan