У мене є панель дій з меню. Як я можу приховати / показати цей пункт меню?
Це те, що я намагаюся зробити:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
У мене є панель дій з меню. Як я можу приховати / показати цей пункт меню?
Це те, що я намагаюся зробити:
MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
Відповіді:
Отримайте MenuItem
вказівку на такий елемент, зателефонуйте setVisible
на нього, щоб відрегулювати його видимість, а потім зателефонуйте invalidateOptionsMenu()
на свою активність, щоб меню ActionBar було відповідно налаштоване.
Оновлення: A MenuItem
- це не звичайний вигляд, який є частиною вашого макета. Це щось особливе, зовсім інше. Ваш код повертається null
до, item
і це призводить до збоїв. Що замість цього вам потрібно зробити:
MenuItem item = menu.findItem(R.id.addAction);
Ось послідовність, у якій слід зателефонувати: спочатку дзвоніть, invalidateOptionsMenu()
а потім всередині onCreateOptionsMenu(Menu)
отримуйте посилання на MenuItem (зателефонувавши menu.findItem()
) та зателефонуйте setVisible()
на нього
MenuItem
може бути null
тому, що ви використовуєте getItem
замість цього findItem
. Ми ніколи не могли знати, не бачивши і ваш код, і журнал збоїв.
onCreateOptionsMenu
і встановіть видимість цього пункту в цій точці. Або тримайте посилання навколо, поки не вирішите, чи воно повинно бути видимим чи ні.
invalidateOptionsMenu()
а потім всередину onCreateOptionsMenu(Menu)
отримати посилання на MenuItem
(подзвонивши menu.findItem()
) та зателефонувавши setVisible()
на нього. Відповіді suhas_sm та P1r4nh4 представляють правильний підхід.
Знайдено доповнення до цього питання:
Якщо ви хочете змінити видимість елементів меню в дорозі, вам просто потрібно встановити змінну учасника у вашій діяльності, щоб пам’ятати, що ви хочете приховати меню, а також зателефонувати invalidateOptionsMenu()
та приховати пункти у переоформленому onCreateOptionsMenu(...)
способі.
//anywhere in your code
...
mState = HIDE_MENU; // setting state
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == HIDE_MENU)
{
for (int i = 0; i < menu.size(); i++)
menu.getItem(i).setVisible(false);
}
}
У своєму прикладі я приховав усі предмети.
if (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }
Документи констатують: "Ви повинні повернути значення true для відображення меню; якщо ви повернете false, воно не відображатиметься".
onPrepareOptionsMenu()
слід використовувати для логіки шоу / приховування замість того, onCreateOptionsMenu()
як він називається лише один раз, тому не корисний, якщо ви хочете змінити пункти меню після його ініціалізації. Тож надуйте в onCreate, але покажіть / ховайтеся в onPrepare.
Так.
invalidateOptionsMenu()
коли хочете приховати цю опцію. Це зателефонуєonCreateOptionsMenu()
.onCreateOptionsMenu()
, перевірка прапора / стану і показати або приховати його наступним чином:MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }
invalidateOptionsMenu
замість цього invalidateOptions
?
onCreateOptionsMenu
Ви можете зателефонувати так:
MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);
Оновлення:
Переконайтеся , що ваш код не повертається null
на item
або він може не додатки.
Я шукав відповідь з трохи більше контексту. Тепер, коли я це зрозумів, я додам цю відповідь.
За замовчуванням кнопка спільного доступу буде прихована, як встановлено android:visible="false"
.
main_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">
<!-- hide share button by default -->
<item
android:id="@+id/menu_action_share"
android:icon="@drawable/ic_share_white_24dp"
android:visible="false"
android:title="Share"
app:showAsAction="always"/>
<item
android:id="@+id/menu_action_settings"
android:icon="@drawable/ic_settings_white_24dp"
android:title="Setting"
app:showAsAction="ifRoom"/>
</menu>
Але необов'язково може бути показана кнопка спільного використання на основі певної умови.
MainActivity.java
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_menu, menu);
MenuItem shareItem = menu.findItem(R.id.menu_action_share);
// show the button when some condition is true
if (someCondition) {
shareItem.setVisible(true);
}
return true;
}
invalidateOptionsMenu()
для оновлення меню.
не працювало для мене. Довелося явно використовувати, onPrepareOptionsMenu
щоб встановити предмет невидимим.
Тому використовуйте onCreateOptionsMenu
для створення меню та onPrepareOptionsMenu
зміни видимості тощо.
onPrepareOptionsMenu
схоже, потрібне місце для здійснення такого типу операцій: "Підготуйте меню до стандартних опцій екрану для відображення. Це викликається перед тим, як меню відображатиметься кожного разу, коли воно відображається Ви можете використовувати цей метод для ефективного включення / відключення елементів або іншим чином динамічно змінювати вміст. "
invalidateOptionsMenu()
для оновлення меню.
Спочатку встановіть видимість пункту меню в помилковому файлі меню таким чином:
<?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:visible="false"
android:id="@+id/action_do_something"
android:title="@string/txt_do_something"
app:showAsAction="always|withText"
android:icon="@drawable/ic_done"/>
</menu>
Потім ви можете просто встановити видимість пункту меню в false у вашому onCreateOptionsMenu () після надуття меню.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(menu,R.menu.menu);
MenuItem item = menu.findItem(R.id.menuItemId);
if (item != null){
item.setVisible(false);
}
}
Спробуйте це:
MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
Це працювало для мене як з діяльності, так і з фрагмента
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
if (menu.findItem(R.id.action_messages) != null)
menu.findItem(R.id.action_messages).setVisible(false);
}
Відповідь P1r4nh4 працює добре, я просто спростив її за допомогою булевого прапора:
public int mState = 0; //at the top of the code
//where you want to trigger the hide action
mState = 1; // to hide or mState = 0; to show
invalidateOptionsMenu(); // now onCreateOptionsMenu(...) is called again
...
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// inflate menu from xml
MenuInflater inflater = getSupportMenuInflater();
inflater.inflate(R.menu.settings, menu);
if (mState == 1) //1 is true, 0 is false
{
//hide only option 2
menu.getItem(2).setVisible(false);
}
}
0
і 1
не є "булевим прапором", це псевдобулевий. до того ж, тут немає жодної причини використовувати фактичну булеву форму.
Згідно з офіційним сайтом для розробників Android, OnCreateOptionMenu (меню меню) не рекомендується змінювати елементи меню та піктограми, видимість. Тощо у час виконання.
Після виклику системи onCreateOptionsMenu () вона зберігає екземпляр меню, яке ви заповнюєте, і не зателефонує onCreateOptionsMenu () знову, якщо меню з якихось причин не буде скасовано. Однак ви повинні використовувати onCreateOptionsMenu () лише для створення початкового стану меню та не для внесення змін протягом життєвого циклу діяльності.
Якщо ви хочете змінити меню параметрів на основі подій, що відбуваються протягом життєвого циклу діяльності, це можна зробити за допомогою методу onPrepareOptionsMenu (). Цей метод передає вам об’єкт меню, як він існує, щоб ви могли його змінити, наприклад додавати, видаляти або відключати елементи. (Фрагменти також надають зворотний виклик onPrepareOptionsMenu ().) - Офіційний сайт AndroidDeveloper -
Як рекомендовано Ви можете використовувати цей метод onOptionsItemSelected (пункт менюItem) відстежувати введення користувачів.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.edit) {
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra(BUNDLE_KEY, mConnection);
startActivityForResult(intent, PICK_CHANGE_REQUEST);
return true;
} else if (id == R.id.delete) {
showDialog(this);
return true;
}
return super.onOptionsItemSelected(item);
}
Якщо вам потрібно змінити елементи меню під час виконання, ви можете використовувати onPrepareOptionsMenu (меню меню), щоб змінити їх
@Override
public boolean onPrepareOptionsMenu(Menu menu){
if (Utils.checkNetworkStatus(ExampleActivity.this)) {
menu.findItem(R.id.edit).setVisible(true);
menu.findItem(R.id.delete).setVisible(true);
}else {
menu.findItem(R.id.edit).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
}
return true;
}
setVisible(false)
для завжди видимого елемента, він не зникає, поки не натискаю на три крапки (саме меню). Якщо я використовую invalidateOptionsMenu()
в onPrepareOptionsMenu
елементах, негайно реорганізую себе, але вони втрачають свої дії (якщо я натискаю на будь-який предмет, він нічого не робить).
встановити значення змінної та викликати invalidateOptionsMenu ();
наприклад
selectedid=arg2;
invalidateOptionsMenu();
public boolean onPrepareOptionsMenu(Menu menu) {
if(selectedid==1){
menu.findItem(R.id.action_setting).setVisible(false);
menu.findItem(R.id.action_s2).setVisible(false);
menu.findItem(R.id.action_s3).setVisible(false);
}
else{
if(selectedid==2){
menu.findItem(R.id.action_search).setVisible(false);
menu.findItem(R.id.action_s4).setVisible(false);
menu.findItem(R.id.action_s5).setVisible(false);
}
}
return super.onPrepareOptionsMenu(menu);
}
setVisible(false)
для завжди видимого елемента, він не зникає, поки не натискаю на три крапки (саме меню). Якщо я використовую invalidateOptionsMenu()
в onPrepareOptionsMenu
елементах, негайно реорганізую себе, але вони втрачають свої дії (якщо я натискаю на будь-який предмет, він нічого не робить).
Ви можете toolbar.getMenu().clear();
приховати всі пункти меню одночасно
Встановивши видимість усіх елементів у меню, меню панелі додатків або меню переповнення буде автоматично приховано
Приклад
private Menu menu_change_language;
...
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
...
menu_change_language = menu;
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(true);
return super.onCreateOptionsMenu(menu);
}
Перш ніж перейти до іншого фрагмента, використовуйте наступний код:
if(menu_change_language != null){
menu_change_language.findItem(R.id.menu_change_language)
.setVisible(false);
}
https://stackoverflow.com/a/21215280/466363 - відповіли Look Alterno та Sufian
.
private Menu mMenu;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.track_fragment, menu);
mMenu = menu;
}
...
private void someMethod() {
...
if (mMenu != null) {
MenuItem item = mMenu.findItem(R.id.new_track);
if (item != null) {
item.setVisible(false);
ActivityCompat.invalidateOptionsMenu(this.getActivity());
}
}
...
}
ActivityCompat.invalidateOptionsMenu () не повертає виклик onPrepareOptionsMenu (); воно просто оновить меню безпосередньо.
Мій someMethod () викликає з декількох місць, ще до onCreateOptionsMenu (), тому я повинен перевірити mMenu! = Null.
Якщо ви зробили все, як описано вище, але пункт меню все ще видно, перевірте, чи посилаєтесь на унікальний ресурс. Наприклад, у onCreateOptionsMenu або onPrepareOptionsMenu
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuOpen = menu.findItem(R.id.menu_open);
menuOpen.setVisible(false);
}
Ctrl + Клацніть R.id.menu_open і перевірте, чи існує він лише в одному файлі меню. У випадку, коли цей ресурс уже використовується де-небудь і завантажений у активності, він спробує там заховатися.
Найкращий спосіб приховати всі елементи в меню лише однією командою - використовувати "групу" у своєму меню xml. Просто додайте всі пункти меню, які будуть у вашому меню переповнення всередині тієї самої групи.
У цьому прикладі у нас є два пункти меню, які завжди відображатимуться (звичайний елемент та пошук) та три елементи переповнення:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/someItemNotToHide1"
android:title="ITEM"
app:showAsAction="always" />
<item
android:id="@+id/someItemNotToHide2"
android:icon="@android:drawable/ic_menu_search"
app:showAsAction="collapseActionView|ifRoom"
app:actionViewClass="android.support.v7.widget.SearchView"
android:title="Search"/>
<group android:id="@+id/overFlowItemsToHide">
<item android:id="@+id/someID"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID2"
android:orderInCategory="1" app:showAsAction="never" />
<item android:id="@+id/someID3"
android:orderInCategory="1" app:showAsAction="never" />
</group>
</menu>
Потім у своїй діяльності (бажано в onCreateOptionsMenu) використовуйте команду setGroupVisible для встановлення видимості всіх пунктів меню на false або true.
public boolean onCreateOptionsMenu(Menu menu) {
menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Якщо ви хочете використовувати цю команду в будь-якому іншому місці у своїй діяльності, не забудьте зберегти клас меню в локальному і завжди перевіряйте, чи меню недійсне, тому що ви можете виконати перед createOptionsMenu:
Menu menu;
public boolean onCreateOptionsMenu(Menu menu) {
this.menu = menu;
}
public void hideMenus() {
if (menu != null) menu.setGroupVisible(R.id.overFlowItems, false); // Or true to be visible
}
Для тих, хто використовує бібліотеку Appcompat: Якщо ваш підклас активності ActionBarActivity, ви можете викликати supportInvalidateOptionsMenu ()
Побачене тут: https://stackoverflow.com/a/19649877/1562524
Я думаю, що кращим підходом було б використовувати змінну члена для меню, ініціалізувати її в onCreateOptionsMenu () і просто використовувати setVisible () згодом, не змінюючи меню параметрів.
цей код працював на мене
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
if (Application.sharedPreferences.getInt("type",1) == 2)
{
menuItem = menu.findItem(R.id.menu_travel_orders);
menuItem.setVisible(false);
}
return super.onCreateOptionsMenu(menu);
}
Цей підхід працював на мене:
private Menu thismenu;
if (condition)
{
if(thismenu != null)
{
thismenu.findItem(R.id.menu_save).setVisible(true);
Toast.makeText(ProfileActivity.this,
""+thismenu.findItem(R.id.menu_save).getTitle(),
Toast.LENGTH_SHORT).show();
}else
{
thismenu.findItem(R.id.menu_save).setVisible(false);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.profile_menu, menu);
thismenu = menu;
return true;
}
Ви намагаєтеся отримати доступ до пункту меню із діяльності, яка не має доступу до області. Виклик пошуку пункту меню повернеться до нуля , оскільки представлення не пов'язане ні з активністю, ні з макетом ви дзвоните.
Пункти меню пов'язуються з такими пунктами, як "Панель навігації ", які в свою чергу пов'язуються з відповідною діяльністю.
Тому ініціалізуйте ці перегляди в діяльності (), а потім перейдіть до пунктів меню, використовуючи ці представлення.
Navigation navView;
navView = findViewById(R.id.navigationView);
MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);
використання invalidateOptionsMenu()
для того, щоб зателефонувати onPrepareOptionsMenu(menu: Menu?)
ви повинні використовувати onCreateOptionsMenu () лише для створення початкового стану меню та не для внесення змін протягом життєвого циклу діяльності ...
Коли відбувається подія, і ви хочете виконати оновлення меню, вам потрібно зателефонувати invalidateOptionsMenu (), щоб попросити системний виклик onPrepareOptionsMenu ().
Android котлін, програмно приховає або встановить видимість елемента меню на панелі дій.
override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater
inflater.inflate(R.menu.main_menu, menu)
val method = menu.findItem(R.id.menu_method)
method.isVisible = false //if want to show set true
return super.onCreateOptionsMenu(menu)
}