2011-08-20 26 views
71

Có thể thay đổi các mục menu tùy chọn theo chương trình không? Bất cứ ai có thể cung cấp cho tôi một ví dụ xin vui lòng? Ngoài ra, tôi muốn vô hiệu hóa các mục nhất định, để chúng không nghe các nhấp chuột, có thể không?android: thay đổi các mục menu tùy chọn theo lập trình

Cảm ơn.

+1

gì thay đổi nào bạn muốn? –

Trả lời

25

menu.xml

<item 
    android:id="@+id/item1" 
    android:title="your Item"> 
    </item> 

đặt trong file java của bạn

public void onPrepareOptionsMenu(Menu menu) { 

    menu.removeItem(R.id.item1); 
} 
+2

vô hiệu hóa không xóa – zizoujab

+0

Tính năng này có hiệu quả đối với tôi. Cảm ơn. –

+0

Đây là một trong những tôi đang tìm kiếm vì tôi muốn đưa ra quyết định một lần trong thời gian chạy nhưng không cần phải thay đổi các tùy chọn sau. Tôi đã sử dụng: @Override boolean công khai trênPrepareOptionsMenu (Menu trình đơn) { nếu (! ShowItemName) { menu.removeItem (R.id.itemname); } trả về true; } – notmystyle

7

Nếu tôi phải thay đổi các nội dung của menu tùy chọn của tôi, tôi thực hiện nó trong onMenuOpened(). Điều này cho phép tôi kiểm tra trạng thái đang chạy vào đúng thời điểm người dùng đang truy cập menu.

public boolean onMenuOpened(int featureid, Menu menu) 
    { 
     menu.clear(); 
     if (!editable) 
     { 
      MenuItem itemAdd = menu.add(0, REASSIGN, Menu.NONE, context.getString(R.string.reassign)); 
      MenuItem itemMod = menu.add(1, EDIT, Menu.NONE, context.getString(R.string.modify)); 
      MenuItem itemDel = menu.add(2, DELETE, Menu.NONE, context.getString(R.string.delete)); 
      itemAdd.setShortcut('0', 'a'); 
      itemMod.setShortcut('1', 'm'); 
      itemDel.setShortcut('2', 'd'); 
     } 
     else 
     { 
      MenuItem itemSave = menu.add(3, SAVE, Menu.NONE, context.getString(R.string.savechanges)); 
      itemSave.setShortcut('0', 'S'); 
     } 


     return true; 
    } 
182

Đối với bất cứ ai cần phải thay đổi các tùy chọn của menu động:

private Menu menu; 

// ... 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    this.menu = menu; 
    getMenuInflater().inflate(R.menu.options, menu); 
    return true; 
} 

// ... 

private void hideOption(int id) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setVisible(false); 
} 

private void showOption(int id) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setVisible(true); 
} 

private void setOptionTitle(int id, String title) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setTitle(title); 
} 

private void setOptionIcon(int id, int iconRes) 
{ 
    MenuItem item = menu.findItem(id); 
    item.setIcon(iconRes); 
} 
+0

Tôi đã thử điều này, nhưng không giúp bạn có thể giúp tôi tại sao? – Prateek

+7

Một lưu ý là bạn phải đảm bảo rằng 'menu' đã được thiết lập trước khi cố gắng lấy một 'MenuItem' ra khỏi nó. Ví dụ, nếu bạn có một cái gì đó như 'actionBar.setNavigationMode (ActionBar.NAVIGATION_MODE_TABS)', các tab được nạp trước menu, do đó, gọi 'hideOption' /' showOption' trong kết quả 'onTabSelected' trong một ngoại lệ con trỏ null. – SaltyNuts

+3

Tại sao điều này không được đánh dấu là giải pháp đúng? nó giải thích tốt hơn giải pháp so với câu trả lời "đúng". – GiaNU

5

Để vô hiệu hóa các mục nhất định:

MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML); 
item.setEnabled(false); 
2

Bạn có thể làm một cái gì đó đơn giản như tôi đã làm. Chỉ cần thay đổi văn bản thành nội dung cần thiết khi mục menu được chạm vào. Tôi cần bật tắt âm thanh, cộng với khả năng thực hiện một hành động bằng cách chạm vào nó. Đây là mã của tôi:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
    case R.id.audioOn: 
     audioOn = !audioOn; 
     if (audioOn) 
      item.setTitle("Audio Off"); 
     else 
      item.setTitle("Audio On"); 
     return true; 

    case R.id.touchOn: 
     touchOn = !touchOn; 
     if (touchOn) 
      item.setTitle("Touch Off"); 
     else 
      item.setTitle("Touch On"); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

âm thanhĐang chạm và được kiểm tra ở các phần khác của mã. Hi vọng điêu nay co ich.

+0

Làm cách nào tôi có thể thực hiện điều này một cách linh hoạt. Ý tôi là ... gọi một webservice để chọn một mục tùy chọn và sau đó trên phản hồi thành công của nó ... gọi lại onCreateOptionsMenu. Làm thế nào để làm như vậy? – NarendraJi

3

Hãy thử mã này:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    this.menu=menu; 
    updateMenuItems(menu); 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.document_list_activity_actions, menu); 
    return super.onCreateOptionsMenu(menu); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle presses on the action bar items 
    if (item.getItemId() == android.R.id.home) { 
     onHomeButtonPresssed(); 
    }else if (item.getItemId() == R.id.action_delete) { 
     useCheckBoxAdapter=false; 
     deleteDocuments(); 
    } else if (item.getItemId() == R.id.share) { 
     useCheckBoxAdapter=false; 
     shareDocuments(); 
    } else if (item.getItemId() == R.id.action_tick) { 
     useCheckBoxAdapter=true; 
     onShowCheckboxes(); 
    } 
    updateMenuItems(menu); 
    return true; 
} 

private void updateMenuItems(Menu menu){ 
    if (useCheckBoxAdapter && menu != null) { 
     menu.findItem(R.id.action_delete).setVisible(true); 
     menu.findItem(R.id.share).setVisible(true); 
     menu.findItem(R.id.action_tick).setVisible(false); 
    } else { 
     menu.findItem(R.id.action_delete).setVisible(false); 
     menu.findItem(R.id.share).setVisible(false); 
     menu.findItem(R.id.action_tick).setVisible(true); 
    } 
    invalidateOptionsMenu(); 
} 
0

bạn có thể hoàn thành nhiệm vụ của bạn chỉ đơn giản bằng cách thực hiện như sau:

private Menu menu; 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.drive_menu, menu); 
    return true; 
} 

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    this.menu = menu; 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == R.id.action_toggle_grid) { 
     handleMenuOption(id); 
     return true; 

    } else if(id == R.id.action_toggle_list){ 
     handleMenuOption(id); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

private void handleMenuOption(int id) { 
    MenuItem item = menu.findItem(id); 
    if (id == R.id.action_toggle_grid){ 
     item.setVisible(false); 
     menu.findItem(R.id.action_toggle_list).setVisible(true); 
    }else if (id == R.id.action_toggle_list){ 
     item.setVisible(false); 
     menu.findItem(R.id.action_toggle_grid).setVisible(true); 
    } 
} 
4

sử dụng các dòng sau tôi đã làm thêm các giá trị trong menu

getActivity().invalidateOptionsMenu(); 

thử công việc này như một sự quyến rũ đối với tôi.

1

Trong trường hợp bạn có một BottomBar:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    if (mBottomBar.getCurrentTabId() == R.id.tab_more) { 
     getMenuInflater().inflate(R.menu.more_menu, menu); 
    } 

    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.preferences: 
      startActivity(new Intent(this, PreferenceActivity.class)); 
      break; 
    } 

    return super.onOptionsItemSelected(item); 
} 

Sau đó, bạn chỉ cần gọi:

@Override 
public void onBottomBarClick(int tabId) { 
    supportInvalidateOptionsMenu(); 
} 
Các vấn đề liên quan