簡體   English   中英

如何隱藏操作欄中的菜單項?

[英]How do I hide a menu item in the actionbar?

我有一個帶有菜單項的操作欄。 如何隱藏/顯示該菜單項?

這就是我想要做的:

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

獲取指向此類項目的MenuItem ,對其調用setVisible以調整其可見性,然后在您的 Activity 上調用invalidateOptionsMenu()以便相應地調整 ActionBar 菜單。

更新: MenuItem不是布局中的常規視圖。 它有些特別,完全不同。 您的代碼為item返回null ,這導致了崩潰。 你需要做的是:

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

以下是您應該調用的順序:首先調用invalidateOptionsMenu()然后在onCreateOptionsMenu(Menu)內部獲取對 MenuItem 的引用(通過調用menu.findItem() )並對其調用setVisible()

找到了這個問題的附錄:

如果您想隨時隨地更改菜單項的可見性,您只需要在您的活動中設置一個成員變量以記住您要隱藏菜單並調用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);
    }
}

在我的示例中,我隱藏了所有項目。

是的。

  1. 您可以設置標志/條件。
  2. 當你想隱藏選項時調用invalidateOptionsMenu() 這將調用onCreateOptionsMenu()
  3. onCreateOptionsMenu() ,檢查標志/條件並按以下方式顯示或隱藏它:
 MenuItem item = menu.findItem(R.id.menu_Done); if (flag/condition)) { item.setVisible(false); } else { }

你可以這樣稱呼:

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

更新:

確保您的代碼不會為item返回null ,否則可能會導致應用程序崩潰。

我正在尋找具有更多上下文的答案。 現在我已經弄清楚了,我將添加該答案。

默認情況下在菜單 xml 中隱藏按鈕

默認情況下,共享按鈕將被隱藏,由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>

在代碼中顯示按鈕

但是可以根據某些條件選擇顯示共享按鈕。

在此處輸入圖片說明

主活動.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;
}

也可以看看

對我不起作用。 我必須明確使用onPrepareOptionsMenu來設置一個項目不可見。

所以使用onCreateOptionsMenu來創建菜單和onPrepareOptionsMenu來改變可見性等。

試試這個:

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

最初在菜單布局文件中將菜單項可見性設置為 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>

然后,您可以在對菜單進行充氣后,在 onCreateOptionsMenu() 中簡單地將菜單項的可見性設置為 false。

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

這從 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);
}

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

根據 Android 開發者官方網站,不建議在運行時更改菜單項或圖標、可見性等時使用 OnCreateOptionMenu(Menu menu)。

在系統調用 onCreateOptionsMenu() 之后,它會保留您填充的 ​​Menu 的一個實例並且不會再次調用 onCreateOptionsMenu() 除非菜單因某種原因失效。 但是,您應該僅使用 onCreateOptionsMenu() 來創建初始菜單狀態,而不要在活動生命周期中進行更改。

如果要根據活動生命周期期間發生的事件修改選項菜單,可以在 onPrepareOptionsMenu() 方法中進行。 此方法向您傳遞當前存在的 Menu 對象,以便您可以對其進行修改,例如添加、刪除或禁用項目。 (Fragments 還提供了 onPrepareOptionsMenu() 回調。)-- AndroidDeveloper 官方網站--

推薦您可以使用此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;
} 

您可以使用toolbar.getMenu().clear(); 一次隱藏所有菜單項

使用一個命令隱藏菜單中所有項目的最佳方法是在菜單 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
}

如果你想在你的 Activity 的任何其他地方使用這個命令,請確保將菜單類保存到本地,並始終檢查菜單是否為空,因為你可以在 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       
}

通過設置Menu中所有項目的Visibility,appbar菜單或溢出菜單將被自動隱藏

例子

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

為變量設置一個值並調用 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);
}

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

如果您按照上述答案進行了所有操作,但菜單項仍然可見,請檢查您是否引用了唯一資源。 例如,在 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 並檢查它是否僅存在於一個菜單文件中。 如果此資源已在任何地方使用並加載到活動中,它將嘗試隱藏在那里。

對於使用 Appcompat 庫的用戶:如果您的 Activity 子類化 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;
}

您正在嘗試從活動訪問菜單項,而該活動無權訪問范圍。 查找菜單項的調用將返回null ,因為該視圖既不與您正在調用的活動也不與布局綁定。

菜單項與諸如“導航欄”之類的項綁定,而導航欄又與相應的活動綁定。

所以在activity()中初始化這些視圖,然后使用這些視圖訪問菜單項。

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()。

https://developer.android.com/guide/topics/ui/menus

Android kotlin,以編程方式隱藏或設置操作欄中菜單項的可見性。

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

這對我有用; 我希望它能幫助你:

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
    getMenuInflater().inflate(R.menu.my_menu_setting, menu);

    for (int i = 0; i < menu.size(); i++){
        if(menu.getItem(i).getItemId() == R.id.this_item_i_want_to_hide){
            menu.getItem(i).setVisible(false);
        }
    }

    return true;
}

以正常方式創建菜單選項,請參閱下面的代碼,並將類中的全局引用添加到菜單

Menu mMenu;  // global reference within the class
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_tcktdetails, menu);
    mMenu=menu;  // assign the menu to the new menu item you just created 
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_cancelticket) {
        cancelTicket();

        return true;
    }

    return super.onOptionsItemSelected(item);
}

現在,您可以通過使用按鈕或在函數內運行此代碼來切換菜單

if(mMenu != null) {
                mMenu.findItem(R.id.action_cancelticket).setVisible(false);
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM