web-dev-qa-db-ja.com

アクションバーのメニュー項目を非表示にする方法

メニューアイテム付きのアクションバーがあります。そのメニュー項目を非表示/表示するにはどうすればよいですか。

これは私がやろうとしていることです:

MenuItem item = (MenuItem) findViewById(R.id.addAction);
item.setVisible(false);
this.invalidateOptionsMenu();
304
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()を呼び出します。

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

私の例では、すべてのアイテムを隠しました。

146
P1r4nh4

はい。

  1. あなたはフラグ/条件を設定することができます。
  2. オプションを隠したいときはinvalidateOptionsMenu()を呼び出します。これはonCreateOptionsMenu()を呼び出します。
  3. onCreateOptionsMenu()では、フラグ/条件をチェックして、以下のように表示または非表示にします。
MenuItem item = menu.findItem(R.id.menu_Done);

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

あなたはこれを呼び出すことができます:

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

更新:

コードがnullに対してitemを返さないようにしてください。そうしないと、アプリケーションがクラッシュする可能性があります。

37
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>

メニューを展開した後は、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);
    }
}
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

Menuのすべての項目の可視性を設定することによって、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);
}
3
Hantash Nadeem

値を変数に設定して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 Developer Officialサイトによると、OnCreateOptionMenu(メニューメニュー)はメニュー項目やアイコンを変更することを推奨されていません。実行時の可視​​性など

システムがonCreateOptionsMenu()を呼び出した後、システムはユーザーが設定したMenuのインスタンスを保持し、何らかの理由でメニューが無効にされない限り再度onCreateOptionsMenu()を呼び出しません。ただし、onCreateOptionsMenu()は、初期メニュー状態を作成するためにのみ使用し、アクティビティのライフサイクル中に変更を加えないでください。

アクティビティのライフサイクル中に発生したイベントに基づいてオプションメニューを変更したい場合は、onPrepareOptionsMenu()メソッドで変更できます。このメソッドは、現在存在しているMenuオブジェクトを渡します。そのため、アイテムの追加、削除、無効化など、変更することができます。 (フラグメントは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(メニューメニュー) を使用してそれらを変更できます。

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

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 リソースを参照していることを確認してください。たとえば、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をクリックし、それが1つのメニューファイルにのみ存在することを確認します。このリソースが既にどこかで使用されていてアクティビティにロードされている場合は、そこに隠そうとします。

2
CoolMind

これを試して:

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

もっと良い方法は、メニューにメンバー変数を使い、onCreateOptionsMenu()で初期化し、その後オプションメニューを無効にせずに単にsetVisible()を使うことだと思います。

1

Appcompatライブラリを使用している場合:ActivityがActionBarActivityをサブクラス化している場合は、supportInvalidateOptionsMenu()を呼び出すことができます。

ここに見られる: https://stackoverflow.com/a/19649877/1562524

1
RuideraJ

1つのコマンドでメニュー内のすべての項目を非表示にする最善の方法は、メニューxmlに "group"を使用することです。オーバーフローメニューに含まれるすべてのメニュー項目を同じグループ内に追加するだけです。

この例では、常に表示される2つのメニュー項目(通常の項目と検索)と3つのオーバーフロー項目があります。

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

このコマンドをアクティビティの他の場所で使用する場合は、必ずメニュークラスをローカルに保存し、常にmenuが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       
}
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
Forest baba

このコードは私のために働いた

@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

あなたは活動からメニュー項目にアクセスしようとしています、それはスコープへのアクセスを持っていません。ビューが呼び出し元のアクティビティもレイアウトもでバインドされていないため、メニュー項目を検索するための呼び出しはnullを返します。

メニュー項目は "Navigation Bar"のような項目と結合されていて、対応するアクティビティと結合されています。

そのため、activity()でそれらのビューを初期化してから、そのビューでメニュー項目にアクセスします。

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

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

invalidateOptionsMenu()を使用

onPrepareOptionsMenu(menu: Menu?)を呼び出すため

onCreateOptionsMenu()は、初期メニュー状態を作成するためにのみ使用し、アクティビティライフサイクル中に変更を加えないでください...

イベントが発生し、メニューの更新を実行する場合、invalidateOptionsMenu()を呼び出して、システムがonPrepareOptionsMenu()を呼び出すように要求する必要があります。

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

0
Dan Alboteanu