Можно ли программно изменить пункты меню? Кто-нибудь может привести мне пример, пожалуйста?
Кроме того, я хочу отключить определенные элементы, чтобы они не слушали щелчки, возможно ли это?
Для всех необходимо динамически изменять параметры меню:
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);
}
menu
это было установлено, прежде чем пытаться выйтиMenuItem
из него. Например, если у вас есть что-то вродеactionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)
, вкладки загружаются перед меню, поэтому вызовhideOption
/showOption
внутриonTabSelected
приводит к исключению нулевого указателя.item.setVisible(false);
, элемент скрывается только тогда, когда я нажимаю на само меню. Если я используюinvalidateOptionsMenu();
пункт, не реагирую на нажатие. Буду признателен, если вы можете помочь мне в решении аналогичной проблемы, с которой я столкнулся. stackoverflow.com/questions/54756799/…setVisible
указано, что вы также должны позвонить,setEnabled(false)
иначе элемент все еще можно будет вызвать через его ярлыкmenu.xml
<item android:id="@+id/item1" android:title="your Item"> </item>
поместите в свой файл Java
public void onPrepareOptionsMenu(Menu menu) { menu.removeItem(R.id.item1); }
источник
Как сказал Николай, сделайте это в onPrepareOptionsMenu ().
Для пунктов меню на панели действий вы должны сделать меню недействительным с помощью
activity.invalidateOptionsMenu();
Более подробно это описано здесь. Как я могу обновить ActionBar, когда onPrepareOptionsMenu переключает элементы меню?
источник
Если мне нужно изменить содержимое меню параметров, я выполняю это во время 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; }
источник
Чтобы отключить определенные элементы:
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/…используя следующие строки, которые я сделал, чтобы добавить значения в меню
попробуйте эту работу как шарм для меня.
источник
Попробуйте этот код:
@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/…Вы можете сделать что-нибудь простое, как я. Просто измените текст на нужный при касании пункта меню. Мне нужно было выключать и включать звук, а также иметь возможность выполнять действие, касаясь его. Вот мой код:
@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 - это логические значения, проверенные в других частях кода. Надеюсь это поможет.
источник
вы можете выполнить свою задачу, просто выполнив следующие действия:
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); } }
источник
Если у вас есть 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(); }
источник
Код Kotlin для программного доступа к элементам панели инструментов OptionsMenu и изменения текста / значка, ..:
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 }
источник
@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; }
источник