android: thay đổi các mục menu tùy chọn theo chương trình


89

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ụ được không?

Ngoài ra, tôi muốn vô hiệu hóa một số mục nhất định để chúng không nghe thấy tiếng nhấp chuột, có được không?

Câu trả lời:


211

Đối với bất kỳ ai cần 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);
}

8
Một lưu ý là bạn phải đảm bảo điều đó menuđã được thiết lập trước khi cố gắng MenuItemthoát khỏi nó. Ví dụ: nếu bạn có một cái gì đó giống như actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS), các tab được tải trước menu, vì vậy việc gọi hideOption/ showOptiontrong onTabSelecteddẫn đến ngoại lệ con trỏ rỗng.
SaltyNuts

Khi tôi sử dụng item.setVisible(false);, mục chỉ bị ẩn khi tôi nhấp vào chính Menu. Nếu tôi sử dụng invalidateOptionsMenu();mục không phản hồi để nhấp vào. Tôi đánh giá cao nếu bạn có thể giúp tôi về một vấn đề tương tự mà tôi đang gặp phải. stackoverflow.com/questions/54756799/…
Aliton Oliveira

@AlitonOliveira bạn nên đặt phần item.setVisibility (false) của mình vào bên trong phương thức onCreateOptionsMenu bằng cách kiểm tra trạng thái biến cờ của bạn và bạn nên thay đổi giá trị bool của cờ của mình và vô hiệu hóaOptionsMenu. nó sẽ hoạt động.
Kidus Tekeste

Tài liệu về các setVisibletrạng thái mà bạn cũng nên gọi setEnabled(false)nếu không mục vẫn có thể được gọi thông qua phím tắt của nó
Florian Walther

34

menu.xml

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

đưa vào tệp java của bạn

  public void onPrepareOptionsMenu(Menu menu) {

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

Đây là lựa chọn 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 public boolean onPrepareOptionsMenu (Menu menu) {if (! ShowItemName) {menu.removeItem (R.id.itemname); } trả về true; }
notmystyle


7

Nếu tôi phải thay đổi nội dung của menu tùy chọn, 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 ngay tại 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;
    }

Vài lời nhận xét. onMenuOpened được gọi hai lần. Var menu lần đầu là rỗng, var menu lần 2 được chuẩn bị để sử dụng. Tôi luôn sử dụng mệnh đề 'if' để kiểm tra xem menu var có phải là null hay không.
Ksiądz Pistolet

7

Để tắt một số mục nhất định:

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

Khi tôi đặt item.setVisible(false);, mục của tôi chỉ bị ẩn khi tôi nhấp vào chính Menu (ba dấu chấm). Nếu tôi sử dụng invalidateOptionsMenu();một số mục không phản hồi cho nhấp chuột. Tôi đánh giá cao nếu bạn có thể giúp tôi về một vấn đề tương tự mà tôi đang gặp phải. stackoverflow.com/questions/54756799/…
Aliton Oliveira

4

bằng cách sử dụng các dòng sau tôi đã thực hiện để thêm các giá trị trong menu

getActivity().invalidateOptionsMenu();

thử công việc này như một cái duyên với tôi.


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

Khi tôi sử dụng invalidateOptionsMenu();, các mục luôn hiển thị của tôi ngừng hoạt động (ý tôi là các mục không phản hồi với nhấp chuột). Tôi đánh giá cao nếu bạn có thể giúp tôi về một vấn đề tương tự mà tôi đang gặp phải. stackoverflow.com/questions/54756799/…
Aliton Oliveira

2

Bạn có thể làm điều gì đó đơn giản như tôi đã làm. Chỉ cần thay đổi văn bản thành những gì cần thiết khi chạm vào mục menu. Tôi cần tắt và bậ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 âm thanh đó. Đâ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);
    }
}

audioOn và touchOn là các boolean được kiểm tra trong các phần khác của mã. Hi vọng điêu nay co ich.


Làm thế nào tôi có thể làm điều này một cách linh hoạt. Ý tôi là ... gọi một dịch vụ web khi chọn một mục tùy chọn và sau đó phản hồi thành công ... gọi lại onCreateOptionsMenu. Làm thế nào để làm như vậy?
Narendra Singh vào

1

bạn có thể hoàn thành nhiệm vụ của mình đơ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);
    }
}

1

Trong trường hợp bạn có 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();
}

1

Kotlin Code để truy cập thanh công cụ OptionsMenu các mục theo lập trình & thay đổi văn bản / biểu tượng, ..:

1-Chúng tôi có mục menu của chúng tôi trong tệp mục menu như: menu.xml, mã mẫu cho điều này:

 <?xml version="1.0" encoding="utf-8"?> 
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/balance"
      android:title="0"
      android:orderInCategory="100"
      app:showAsAction="always" />
 </menu>

2- Định nghĩa một biến để truy cập đối tượng menu trong lớp:

var menu: Menu? = null

3- khởi tạo nó trong onCreateOptionsMenu:

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    // Inflate the menu; this adds items to the action bar if it is present.
    menuInflater.inflate(R.menu.main, menu)
    this.menu = menu
    return true
}

4- Truy cập các mục menu bên trong mã của bạn hoặc thú vị:

private fun initialBalanceMenuItemOnToolbar() {
var menuItemBalance = menu?.findItem(R.id.balance)
    menuItemBalance?.title = Balance?.toString() ?: 0.toString()
    // for change icon : menuWalletBalance?.icon
}

1
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.calendar, menu);
        if(show_list == true) {         

        if(!locale.equalsIgnoreCase("sk")) menu.findItem(R.id.action_cyclesn).setVisible(false);

        return true;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.