it-swarm.com.ru

Как скрыть пункт меню на панели действий?

У меня есть панель действий с пунктом меню. Как я могу скрыть/показать этот пункт меню?

Вот что я пытаюсь сделать:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
291
Stir Zoltán

Получите MenuItem, указывающую на такой элемент, вызовите setVisible для него, чтобы настроить его видимость, а затем вызовите invalidateOptionsMenu() для своей деятельности, чтобы меню ActionBar было соответствующим образом скорректировано.

Обновление: A MenuItem не является обычным представлением, которое является частью вашего макета. Это что-то особенное, совершенно другое. Ваш код возвращает null для item, и это вызывает сбой. Вместо этого вам нужно сделать следующее:

MenuItem item = menu.findItem(R.id.addAction);

Вот последовательность, в которой вы должны вызывать: Сначала вызов invalidateOptionsMenu(), а затем внутри onCreateOptionsMenu(Menu) получить ссылку на MenuItem (вызвав menu.findItem()) и вызвать setVisible() на нем

428
K-ballo

Нашел дополнение к этому вопросу:

Если вы хотите изменить видимость своих пунктов меню на ходу, вам просто нужно установить переменную-член в своей деятельности, чтобы помнить, что вы хотите скрыть меню и вызывать 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);
    }
}

В моем примере я спрятал все предметы.

142
P1r4nh4

Да. 

  1. Вы можете установить флаг/условие.
  2. Вызовите invalidateOptionsMenu(), если вы хотите скрыть эту опцию. Это вызовет onCreateOptionsMenu().
  3. В onCreateOptionsMenu() проверьте наличие флага/условия и покажите или Скройте его следующим образом:
MenuItem item = menu.findItem(R.id.menu_Done);

if (flag/condition)) {
  item.setVisible(false); 
} else { }
77
suhas_sm

Вы можете назвать это:

MenuItem item = menu.findItem(R.id.my_item);
item.setVisible(false);

Обновление:

Убедитесь, что ваш код не возвращает null для item, иначе это может привести к сбою приложения.

36
elias

Я искал ответ с немного большим контекстом. Теперь, когда я понял это, я добавлю этот ответ.

Скрыть кнопку по умолчанию в меню xml

По умолчанию кнопка «Поделиться» будет скрыта, как установлено Android:visible="false".

 enter image description here

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>

Показать кнопку в коде

Но кнопка «Поделиться» может отображаться в зависимости от некоторых условий.

 enter image description here

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

Смотрите также

28
Suragch

не работает для меня Мне пришлось явно использовать onPrepareOptionsMenu, чтобы установить элемент невидимым.

Поэтому используйте onCreateOptionsMenu для создания меню и onPrepareOptionsMenu для изменения видимости и т.д.

23
hotzen

Это сработало для меня из Activity и Fragment

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

Изначально установите видимость пункта меню в false в файле макета меню следующим образом:

<?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);
    }
}
7
Akhila

Ответ 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);
    }
}
6
Hiram

Вы можете использовать toolbar.getMenu().clear();, чтобы скрыть все пункты меню одновременно 

3
Ajeet Yadav

установить значение переменной и вызвать 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);
}
3
zacharia

Согласно официальному сайту разработчика Android, OnCreateOptionMenu (Меню меню) не рекомендуется для изменения пунктов меню или значков, видимости ... и т.д. Во время выполнения.

После того, как система вызовет onCreateOptionsMenu (), она сохранит экземпляр заполненного вами меню и больше не будет вызывать onCreateOptionsMenu (), если по какой-то причине меню не будет аннулировано. Однако вы должны использовать onCreateOptionsMenu () только для создания исходного состояния меню, а не для внесения изменений в течение жизненного цикла действия.

Если вы хотите изменить меню параметров на основе событий, происходящих в течение жизненного цикла действия, вы можете сделать это в методе onPrepareOptionsMenu (). Этот метод передает вам объект Menu в том виде, в котором он существует в данный момент, чтобы вы могли изменить его, например добавить, удалить или отключить элементы. (Фрагменты также предоставляют обратный вызов onPrepareOptionsMenu ().) - Официальный сайт AndroidDeveloper -

Как рекомендуется Вы можете использовать этот метод onOptionsItemSelected (элемент MenuItem) для отслеживания пользовательских вводов.

@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;
} 
3
S.D.N Chanaka Fernando

https://stackoverflow.com/a/21215280/466363 - отвечают Look Alterno и Sufian

  • ActivityCompat.invalidateOptionsMenu () не вызывает обратный вызов OnPrepareOptionsMenu (); это просто обновить меню напрямую.
  • Мой someMethod () вызывается из нескольких мест, даже раньше OnCreateOptionsMenu (), поэтому я должен проверить mMenu! = Null.
  • должен работать с использованием API 8

,.

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.

  • должен работать с использованием API 8
2
Shimon Doodkin

Если вы сделали все как в ответах выше, но пункт меню все еще виден, проверьте, что вы ссылаетесь на unique resource . Например, в 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 и убедитесь, что он существует только в одном файле меню. В случае, если этот ресурс уже используется где-либо и загружен в упражнении, он попытается скрыться там.

2
CoolMind

При настройке видимости всех элементов в меню, меню панели приложений или переполнение будет автоматически скрывать

Пример

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);
}
2
Hantash Nadeem

этот код работал для меня

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

Я думаю, что лучшим подходом было бы использовать переменную-член для меню, инициализировать ее в onCreateOptionsMenu () и потом просто использовать setVisible (), не аннулируя меню опций.

0
Catalin Clabescu

Для тех, кто использует библиотеку Appcompat: Если ваши подклассы Activity ActionBarActivity, вы можете вызвать supportInvalidateOptionsMenu ()

Видно здесь: https://stackoverflow.com/a/19649877/1562524

0
RuideraJ

Лучший способ скрыть все элементы в меню с помощью одной команды - использовать «группу» в вашем меню 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
}

Если вы хотите использовать эту команду где-либо еще в своей деятельности, обязательно сохраните класс меню в локальном и всегда проверяйте, имеет ли меню значение null, потому что вы можете выполнить его до 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       
}
0
Adriano Moutinho

Этот подход работал для меня:

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;
}
0
Forest baba

Вы пытаетесь получить доступ к элементу меню из действия, которое не имеет доступа к области действия. Вызов, чтобы найти пункт меню, вернет null , потому что представление не связано с ни активностью, ни макетом вы вызываете.

Пункты меню связаны с такими элементами, как « Панель навигации », которые, в свою очередь, связаны с соответствующим действием.

Поэтому инициализируйте эти представления в Activity (), а затем получите доступ к пунктам меню в этих представлениях.

Navigation navView;
navView = findViewById(R.id.navigationView);

MenuItem item = navView.getMenu().findItem(R.id.item_hosting);
item.setVisible(false);
0
VeeyaaR

Попробуй это:

MenuItem myitem = menu.findItem(R.id.my_item);
myitem.setVisible(false);
0
mohamad sheikhi