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

297

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

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

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();

Ваш Ответ

21   ответ
77

You can set a flag/condition. Call invalidateOptionsMenu() when you want to hide the option. This will call onCreateOptionsMenu(). In onCreateOptionsMenu(), check for the flag/condition and show or hide it the following way:
MenuItem item = menu.findItem(R.id.menu_Done);

if (flag/condition)) {
  item.setVisible(false); 
} else { }
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededinvalidateOptionsMenuError: User Rate Limit ExceededinvalidateOptions?
1

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

onPrepareOptionsMenu установить элемент невидимым.

Так что используйтеonCreateOptionsMenu создать меню иonPrepareOptionsMenu изменить видимость и т. д.

Error: User Rate Limit ExceededAndroid's docs onPrepareOptionsMenuError: User Rate Limit Exceeded
3

toolbar.getMenu().clear(); скрыть все пункты меню одновременно

1

Если ваши Action подклассы ActionBarActivity, вы можете вызвать supportInvalidateOptionsMenu ()

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

2

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

7

@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);
}
Error: User Rate Limit Exceeded
143

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

В моем примере я скрыл все элементы.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededif (HIDE_MENU) { return false; } else { getSupportMenuInflater().inflate(R.menu.menu_settings, menu); return true; }Error: User Rate Limit Exceeded
3

например

    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);
}
Error: User Rate Limit ExceededsetVisible(false)Error: User Rate Limit ExceededinvalidateOptionsMenu()Error: User Rate Limit ExceededonPrepareOptionsMenuError: User Rate Limit Exceeded
7

кета меню следующим образом:

<?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);
    }
}
Error: User Rate Limit Exceeded
28

когда я понял это, я добавлю этот ответ.

Hide button by default in menu 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>
Show button in code

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

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;
}
See also Setting Up the App Bar (Android docs for help getting the app/action bar set up)
1

ользовать & quot; group & quot; в вашем меню 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       
}
2

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

пример

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

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

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

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

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

Error: User Rate Limit Exceeded Stir Zoltán
Error: User Rate Limit Exceeded Stir Zoltán
Error: User Rate Limit ExceededonCreateOptionsMenuError: User Rate Limit Exceeded
Error: User Rate Limit ExceededinvalidateOptionsMenu()Error: User Rate Limit ExceededonCreateOptionsMenu(Menu)Error: User Rate Limit ExceededMenuItemError: User Rate Limit Exceededmenu.findItem()Error: User Rate Limit ExceededsetVisible()Error: User Rate Limit Exceededby suhas_smError: User Rate Limit Exceededby P1r4nh4Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededMenuItemError: User Rate Limit ExceedednullError: User Rate Limit ExceededgetItemError: User Rate Limit ExceededfindItemError: User Rate Limit Exceeded
3

According to Android Developer Official site,OnCreateOptionMenu(Menu menu) is not recomended for changing menu items or icons, visibility..etc at Runtime.

After the system calls onCreateOptionsMenu(), it retains an instance of the Menu you populate and will not call onCreateOptionsMenu() again unless the menu is invalidated for some reason. However, you should use onCreateOptionsMenu() only to create the initial menu state and not to make changes during the activity lifecycle.

If you want to modify the options menu based on events that occur during the activity lifecycle, you can do so in the onPrepareOptionsMenu() method. This method passes you the Menu object as it currently exists so you can modify it, such as add, remove, or disable items. (Fragments also provide an onPrepareOptionsMenu() callback.) --AndroidDeveloper Official Site --

Как рекомендуется Вы можете использовать этоonOptionsItemSelected(MenuItem 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(Menu menu) изменить их

@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;
} 
Error: User Rate Limit ExceededsetVisible(false)Error: User Rate Limit ExceededinvalidateOptionsMenu()Error: User Rate Limit ExceededonPrepareOptionsMenuError: User Rate Limit Exceeded
1

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

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

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

6

я просто упростил его, используя логический флаг:

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);
    }
}
Error: User Rate Limit Exceeded0Error: User Rate Limit Exceeded1Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
37

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

Update:<,/strong>

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

2

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

onPrepareOptionsMenu(); it just update the menu directly. My someMethod() get called from several places, even before onCreateOptionsMenu(), so I must check mMenu != null. should work using 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());
           }
       }
   ...
   }

onPrepareOptionsMenu(); it just update the menu directly.

My someMethod() get called from several places, even before onCreateOptionsMenu(), so I must check mMenu != null.

should work using API 8

Похожие вопросы