Czy jest możliwa programowa zmiana pozycji menu opcji? Czy ktoś może podać mi przykład?
Chcę też wyłączyć pewne elementy, aby nie nasłuchiwały kliknięć, czy to możliwe?
Dla każdego trzeba dynamicznie zmieniać opcje menu:
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
zostało ustawione, zanim spróbujesz sięMenuItem
z tego wydostać. Na przykład, jeśli masz coś podobnegoactionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)
, karty są ładowane przed menu, więc wywołaniehideOption
/showOption
withinonTabSelected
skutkuje wyjątkiem wskaźnika o wartości null.item.setVisible(false);
, element zostaje ukryty tylko wtedy, gdy kliknę samo menu. Jeśli używaminvalidateOptionsMenu();
elementu, nie reaguję na kliknięcie. Doceniam, gdybyś mógł mi pomóc w podobnej sprawie, z którą się zmagam. stackoverflow.com/questions/54756799/…setVisible
stwierdza, że należy również zadzwonić, wsetEnabled(false)
przeciwnym razie przedmiot nadal będzie można wywołać za pomocą jego skrótumenu.xml
<item android:id="@+id/item1" android:title="your Item"> </item>
umieść w swoim pliku java
public void onPrepareOptionsMenu(Menu menu) { menu.removeItem(R.id.item1); }
źródło
Jak powiedział Nikolay, zrób to w onPrepareOptionsMenu ().
W przypadku pozycji menu na pasku akcji musisz unieważnić menu za pomocą
activity.invalidateOptionsMenu();
Jest to opisane bardziej szczegółowo tutaj. Jak mogę odświeżyć ActionBar, gdy przełączane pozycje menu onPrepareOptionsMenu?
źródło
Jeśli muszę zmienić zawartość mojego menu opcji, wykonuję to podczas onMenuOpened (). Dzięki temu mogę sprawdzić stan pracy w chwili, gdy użytkownik uzyskuje dostęp do 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; }
źródło
Aby wyłączyć określone elementy:
MenuItem item = menu.findItem(R.id.ID_ASSING_TO_THE_ITEM_IN_MENU_XML); item.setEnabled(false);
źródło
item.setVisible(false);
moja pozycja zostaje ukryta dopiero po kliknięciu samego menu (trzy kropki). Jeśli używaminvalidateOptionsMenu();
niektórych elementów, nie reaguję na kliknięcie. Doceniam, gdybyś mógł mi pomóc w podobnej sprawie, z którą się zmagam. stackoverflow.com/questions/54756799/…korzystając z poniższych wierszy, które zrobiłem, aby dodać wartości w menu
spróbuj tej pracy jak urok dla mnie.
źródło
Wypróbuj ten kod:
@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(); }
źródło
invalidateOptionsMenu();
, moje zawsze widoczne elementy przestają działać (mam na myśli, że elementy nie reagują na kliknięcie). Doceniam, gdybyś mógł mi pomóc w podobnej sprawie, z którą się zmagam. stackoverflow.com/questions/54756799/…Możesz zrobić coś prostego, tak jak ja. Po dotknięciu elementu menu zmień tekst na taki, który jest potrzebny. Musiałem wyłączyć i włączyć dźwięk, a także móc wykonać akcję, dotykając go. Oto mój kod:
@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 i touchOn to wartości logiczne sprawdzane w innych częściach kodu. Mam nadzieję że to pomoże.
źródło
możesz wykonać swoje zadanie, po prostu implementując, jak poniżej:
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); } }
źródło
W przypadku, gdy masz 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); }
Następnie wystarczy zadzwonić:
@Override public void onBottomBarClick(int tabId) { supportInvalidateOptionsMenu(); }
źródło
Kod Kotlin do uzyskiwania dostępu do paska narzędzi Opcje Elementy menu programowo i zmiana tekstu / ikony, ..:
1-Mamy naszą pozycję menu w pliku pozycji menu, takim jak: menu.xml, przykładowy kod do tego:
<?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- Zdefiniuj zmienną dostępu do obiektu menu w klasie:
var menu: Menu? = null
3 - zainicjuj go w 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- Uzyskaj dostęp do pozycji menu w kodzie lub zabawie:
private fun initialBalanceMenuItemOnToolbar() { var menuItemBalance = menu?.findItem(R.id.balance) menuItemBalance?.title = Balance?.toString() ?: 0.toString() // for change icon : menuWalletBalance?.icon }
źródło
@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; }
źródło