2013-06-26 30 views
11

hi frnds đang tạo ứng dụng là ứng dụng tab.cách chúng tôi có thể thêm mục menu động

trong Trang chủ của tôi, mở rộng sherlockFragmentActivity, tôi đang tăng menu.xml và bao gồm mã cho tùy chọnMenuitem click listener. Fragmentactivity chứa tabhost và trên mỗi tab nó tải các mảnh. đây là menu.xml tôi

<item 
     android:id="@+id/action_settings" 
     android:orderInCategory="100" 
     android:showAsAction="always" 
     android:icon="@drawable/setting_selector" 
     android:title="" 
     > 
     <menu > 
      <item 
       android:id="@+id/Profile" 
       android:showAsAction="ifRoom" 
       android:title="Profile"/> 
      <item 
       android:id="@+id/chngDoctor" 
       android:showAsAction="ifRoom" 
       android:title="Change doctor" 
       android:visible="false"/> 
      <item 
       android:id="@+id/changePword" 
       android:showAsAction="ifRoom" 
       android:title="Change password"/> 
      <item 
       android:id="@+id/logout" 
       android:showAsAction="ifRoom" 
       android:title="Logout"/> 
     </menu> 
    </item> 

và đây là onCreateOptionMenu của tôi và phương pháp onOptionItemSelected trong lớp Trang chủ

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // TODO Auto-generated method stub 
    getSupportMenuInflater().inflate(R.menu.main, menu); 
    SubMenu subMenu = (SubMenu) menu.getItem(0).getSubMenu(); 
    if(userType.equals("admin")) 
     subMenu.getItem(1).setVisible(true); 
    else 
     subMenu.getItem(1).setVisible(false); 
    return true; 
} 

và đây là phương pháp onOptionItemSelected tôi

@Override 
    public boolean onOptionsItemSelected(MenuItem item) 
    { 
     switch (item.getItemId()) { 
     case R.id.Profile: 
       break; 
     case R.id.changePword : 
      break; 
     case R.id.chngDoctor : 
       break; 
     case R.id.logout: 
      Home.this.finish(); 
      break; 
     } 
     return true; 
    } 

tôi cần phải thêm một số menu tùy thuộc vào thay đổi tab. đó là trên tab thay đổi tôi tải các mảnh khác nhau và khi thay đổi mảnh tôi cần phải thêm các mục mới vào menu. ListFrag của tôi mở rộng SherlockFragment và nó sẽ tải khi tôi nhấp vào tab thứ 3. khi tải đoạn này tôi cần phải thêm mục 1 menu để vào menu

Trả lời

2

đây là một ví dụ ... nó có thể giúp bạn ...

private static final int MENU_ADD = Menu.FIRST; 
    private static final int MENU_LIST = MENU.FIRST + 1; 
    private static final int MENU_REFRESH = MENU.FIRST + 2; 
    private static final int MENU_LOGIN = MENU.FIRST + 3; 


    @Override 
     public boolean onPrepareOptionsMenu(Menu menu) { 
      menu.clear(); 
      if(enableAdd) 
       menu.add(0, MENU_ADD, Menu.NONE, R.string.your-add-text).setIcon(R.drawable.your-add-icon); 
      if(enableList) 
       menu.add(0, MENU_LIST, Menu.NONE, R.string.your-list-text).setIcon(R.drawable.your-list-icon); 
      if(enableRefresh) 
       menu.add(0, MENU_REFRESH, Menu.NONE, R.string.your-refresh-text).setIcon(R.drawable.your-refresh-icon); 
      if(enableLogin) 
       menu.add(0, MENU_LOGIN, Menu.NONE, R.string.your-login-text).setIcon(R.drawable.your-login-icon); 
      return super.onPrepareOptionsMenu(menu); 
     } 

     @Override 
     public boolean onOptionsItemSelected(MenuItem item) { 
      super.onOptionsItemSelected(item); 

      switch (item.getItemId()) { 
      case MENU_ADD: doAddStuff(); break; 
      case MENU_LIST: doListStuff(); break; 
      case MENU_REFRESH: doRefreshStuff(); break; 
      case MENU_LOGIN: doLoginStuff(); break; 
      } 
      return false; 
+0

vấn đề của tôi là cách thêm mục trình đơn khác nhau cho các mảnh khác nhau – Vikky

21

Hãy thử theo cách sau.

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 

     menu.add(0, 0, 0, "Option1").setShortcut('3', 'c'); 
     menu.add(0, 1, 0, "Option2").setShortcut('3', 'c'); 
     menu.add(0, 2, 0, "Option3").setShortcut('4', 's'); 

     SubMenu sMenu = menu.addSubMenu(0, 3, 0, "SubMenu"); //If you want to add submenu    
     sMenu.add(0, 4, 0, "SubOption1").setShortcut('5', 'z'); 
     sMenu.add(0, 5, 0, "SubOption2").setShortcut('5', 'z');    

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) {   

     switch (item.getItemId()) { 
     case 0: 
      // code for option1 
      return true; 
     case 1: 
      // code for option2 
      return true; 
     case 2: 
      // code for option3 
      return true;    
     case 4: 
      // code for subOption1 
      return true; 
     case 5: 
      // code for subOption2 
      return true;    
     } 
     return super.onOptionsItemSelected(item); 
    } 

Điều này có thể giúp bạn.

+1

tôi cần phải thêm một mục trình đơn mới dynamicaly khi một đoạn cụ thể được nạp – Vikky

+1

bạn đã kiểm tra [này ] (http://stackoverflow.com/questions/13596113/adding-menu-item-dynamically-from-sherlockactionbar-fragment-tabs) câu hỏi? – Gunaseelan

+0

ya .... bây giờ tôi đã nhận được câu trả lời. – Vikky

1

sử dụng onPrepareOptionsMenu phương pháp và rõ ràng tất cả các đơn đầu tiên sử dụng

menu.clear(); 

sau đó thêm menu.

Cũng refer here .. kiểm tra phương pháp onPrepareOptionsMenu

4

Trong menu.xml bạn nên thêm tất cả các mục trong menu. Sau đó, bạn có thể ẩn các mục mà bạn không muốn thấy trong lần tải đầu tiên.

<item 
    android:id="@+id/action_newItem" 
    android:icon="@drawable/action_newItem" 
    android:showAsAction="never" 
    android:visible="false" 
    android:title="@string/action_newItem"/> 

Thêm setHasOptionsMenu(true) vào phương thức onCreate() để gọi các mục menu trong lớp Phân đoạn của bạn.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setHasOptionsMenu(true); 
} 

Bạn không cần ghi đè onCreateOptionsMenu trong lớp Phân đoạn của bạn một lần nữa. Các mục menu có thể được thay đổi (Thêm/remoev) bằng cách ghi đè phương thức onPrepareOptionsMenu có sẵn trong Phân đoạn.

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    menu.findItem(R.id.action_newItem).setVisible(true); 
    super.onPrepareOptionsMenu(menu); 

} 
0

dựa trên Gunaseelan trả lời

@Override 
public boolean onPrepareOptionsMenu(Menu menu) 
{ 
    menu.removeGroup(1); 
    if (iotsnames.isEmpty()) return true; 
    for (int i=0; i<iotsnames.size(); i++){ 
     menu.add(1, i, 0, iotsnames.get(i)); 
    } 
    return true; 
} 
Các vấn đề liên quan