android: програмна зміна пунктів меню параметрів


89

Чи можливо програмно змінити пункти меню опцій? Хто-небудь може надати мені приклад, будь ласка?

Крім того, я хочу відключити певні елементи, щоб вони не слухали клацання, чи можливо це?

Відповіді:


211

Кожному потрібно динамічно змінювати параметри меню:

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
Одне застереження полягає в тому, що menuперед тим, як намагатися MenuItemвийти з нього, потрібно переконатися, що це було встановлено . Наприклад, якщо у вас є щось на зразок actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS), вкладки завантажуються перед меню, тому виклик hideOption/ showOptionусередині onTabSelectedпризводить до винятку нульового покажчика.
SaltyNuts

Коли я використовую item.setVisible(false);, елемент приховується лише тоді, коли я натискаю саме меню. Якщо я використовую invalidateOptionsMenu();товар, не відповідайте на клацання. Я вдячний, якщо ви могли б допомогти мені з подібним питанням, з яким я стикаюся. stackoverflow.com/questions/54756799 / ...
Aliton Олівейра

@AlitonOliveira ви повинні помістити частину item.setVisibility (false) всередину методу onCreateOptionsMenu, перевіривши статус змінної прапора, і вам слід змінити значення bool вашого прапора та invalidateOptionsMenu. це спрацює.
Kidus Tekeste

Документація setVisibleстверджує, що вам слід також зателефонувати, setEnabled(false)інакше товар все ще можна викликати за допомогою ярлика
Флоріан Вальтер,

34

menu.xml

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

помістіть у свій файл Java

  public void onPrepareOptionsMenu(Menu menu) {

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

Це той, кого я шукав, тому що хочу прийняти рішення один раз під час виконання, але не потрібно змінювати параметри після. Я використовував: @Override public boolean onPrepareOptionsMenu (меню меню) {if (! ShowItemName) {menu.removeItem (R.id.itemname); } повернути true; }
notmystyle


7

Якщо мені потрібно змінити вміст меню параметрів, я виконую це під час onMenuOpened (). Це дозволяє мені перевірити робочий стан у той самий момент, коли користувач отримує доступ до меню.

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

Кілька слів коментаря. onMenuOpened викликається двічі. Перший раз var меню є нульовим, другий раз var var підготовлений до використання. Я завжди використовую речення 'if', щоб перевірити, чи не є var змінною null.
Ksiądz Pistolet

7

Щоб вимкнути певні елементи:

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

Коли я встановлюю item.setVisible(false);, мій елемент приховується лише тоді, коли я натискаю саме меню (три крапки). Якщо я використовую invalidateOptionsMenu();деякі елементи, не відповідайте на клацання. Я вдячний, якщо ви могли б допомогти мені з подібним питанням, з яким я стикаюся. stackoverflow.com/questions/54756799 / ...
Aliton Олівейра

4

використовуючи наступні рядки, які я зробив, щоб додати значення в меню

getActivity().invalidateOptionsMenu();

спробуй цю роботу як принаду для мене.


3

Спробуйте цей код:

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

Коли я використовую invalidateOptionsMenu();, мої завжди видимі елементи перестають працювати (я маю на увазі, що елементи не реагують на клацання). Я вдячний, якщо ви могли б допомогти мені з подібним питанням, з яким я стикаюся. stackoverflow.com/questions/54756799 / ...
Aliton Олівейра

2

Ви можете зробити щось просте, як я. Просто змініть текст на потрібний при торканні пункту меню. Мені потрібно було вимкнути і ввімкнути звук, а також можливість виконати дію, торкаючись його. Ось мій код:

    @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 та touchOn - це логічні значення, перевірені в інших частинах коду. Сподіваюся, це допомагає.


Як я можу зробити це динамічно. Я маю на увазі ... виклик веб-служби при виборі елемента опції, а потім про його успішну відповідь ... повторний виклик onCreateOptionsMenu. Як це зробити?
Нарендра Сінгх

1

Ви можете виконати своє завдання, просто виконавши, як показано нижче:

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

Якщо у вас є 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);
}

Тоді вам просто потрібно зателефонувати:

@Override
public void onBottomBarClick(int tabId) {
    supportInvalidateOptionsMenu();
}

1

Код Kotlin для доступу до параметрів панелі інструментів Елементи меню програмно та змініть текст / піктограму, ..:

1 - У нас є пункт меню у файлі пунктів меню, такий як: menu.xml, зразок коду для цього:

 <?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- Визначте змінну для доступу до об’єкта меню в класі:

var menu: Menu? = null

3- ініціюйте його в 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- Доступ до пунктів меню всередині вашого коду або розваг:

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;
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.