web-dev-qa-db-ja.com

さまざまなフラグメントのアクションバーオプションメニュー項目の非表示/表示

シャーロックフラグメントアクティビティがあり、3つのフラグメントがあります。

フラグメントA、フラグメントB、フラグメントCは3つのフラグメントです。完了したオプションメニューをフラグメントBのみに表示したい。

アクティビティはフラグメントAで開始されます。フラグメントBを選択すると、完了ボタンが追加されます。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    if(!menusInflated){
        inflater.inflate(R.menu.security, menu);
        menusInflated=true;
    }

    super.onCreateOptionsMenu(menu, inflater);
}

もう一度フラグメントAを起動するときに、このためにメニューDONE(フラグメントBで設定された)のオプションを選択します。

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

しかし、これはまったく隠れていません。また、アクティビティがフラグメントAで最初に開始された場合、NullPointerExceptionが発生します。

何が問題なのか教えてください。

53
Gaurav Arora

これは、これを行う1つの方法です。

メニューに「グループ」を追加します。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >

    <group
        Android:id="@+id/main_menu_group">
         <item Android:id="@+id/done_item"
              Android:title="..."
              Android:icon="..."
              Android:showAsAction="..."/>
    </group>
</menu>

次に、

Menu menu;

変数をアクティビティに追加し、onCreateOptionsMenuのオーバーライドで設定します。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    this.menu = menu;
    // inflate your menu here
}

その後、メニューを表示/非表示にするときに、この関数をアクティビティに追加して使用します。

public void showOverflowMenu(boolean showMenu){
    if(menu == null)
        return;
    menu.setGroupVisible(R.id.main_menu_group, showMenu);
}

これが最良/唯一の方法だと言っているわけではありませんが、私にとってはうまくいきます。

67
C0D3LIC1OU5

これを試して...

FragmentクラスでonCreateOptionsMenu()を再度オーバーライドする必要はありません。メニュー項目の可視性は、Fragmentクラスで使用可能なonPrepareOptionsMenu()メソッドをオーバーライドすることで変更できます。

 @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_search).setVisible(false);
    super.onPrepareOptionsMenu(menu);
}
94

フラグメントのActionBarにアクションアイテム(アクションボタン)を表示するのは、それらが必要な場合だけです。

saveボタンを、アイテムの入力を受け入れるフラグメントでのみ表示し、アイテムのリストを表示するフラグメントでは表示しないようにしたい場合、これをフラグメントのOnCreateOptionsMenuメソッドに追加します。アイテムを表示します:

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    if (menu != null) {

        menu.findItem(R.id.action_save_item).setVisible(false);
    }
}

注:これを機能させるには、フラグメントにonCreate()メソッド(アイテムボタンを非表示にする場所、この例ではアイテムビューフラグメント)が必要で、setHasOptionsMenu(true)を追加しますこのような:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

最良の選択肢ではないかもしれませんが、それは機能し、簡単です。

20

これは確かに動作します...

// Declare
Menu menu;
MenuItem menuDoneItem;

// Then in your onCreateOptionMenu() method write the following...
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        this.menu=menu;
        inflater.inflate(R.menu.secutity, menu);
            }

// In your onOptionItemSelected() method write the following...
@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.done_item:
                this.menuDoneItem=item;
                someOperation();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

// Now Making invisible any menu item...
public void menuInvisible(){
setHasOptionsMenu(true);// Take part in populating the action bar menu
            menuDoneItem=(MenuItem)menu.findItem(R.id.done_item);
                menuRefresh.setVisible(false); // make true to make the menu item visible.
}

//Use the above method whenever you need to make your menu item visible or invisiable

これを参照することもできます link 詳細については、非常に便利です。

6
MenuItem Import = menu.findItem(R.id.Import);
  Import.setVisible(false)

詳細については、以下を参照してください: http://androiddhina.blogspot.in/2015/05/Android-how-to-hide-menu-item-in.html

5
Dhina k

これを試して

@Override
public boolean onCreateOptionsMenu(Menu menu){
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.custom_actionbar, menu);
    menu.setGroupVisible(...);
}
3
Petrovich Denis

メニューのすべてのアイテムの可視性を設定すると、アプリバーメニューまたはオーバーフローメニューが自動的に非表示になります

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

各フラグメントのメニューと、現在使用中のフラグメントをマークするグローバル変数を作成できます。 onCreateOptionsMenuで変数の値を確認し、正しいメニューを膨らませます

 @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         if (fragment_it == 6) {
             MenuInflater inflater = getMenuInflater();
             inflater.inflate(R.menu.custom_actionbar, menu);
         }
     } 
1
Ibraheem Saoud

こんにちは、私はこれの最良の解決策を手に入れました。メニュー作成メソッドで特定のアイテムを非表示にし、そのアイテムを他のフラグメントに表示する必要があると仮定します。私は2つのメニュー項目の例を取り上げています。1つは編集、もう1つは削除です。たとえば、メニューxmlは次のとおりです。

sell_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">

<item
    Android:id="@+id/action_edit"
    Android:icon="@drawable/ic_edit_white_shadow_24dp"
    app:showAsAction="always"
    Android:title="Edit" />

<item
    Android:id="@+id/action_delete"
    Android:icon="@drawable/ic_delete_white_shadow_24dp"
    app:showAsAction="always"
    Android:title="Delete" />

アクティビティで2つのメソッドをオーバーライドし、フィールド変数mMenuを次のように作成します。

  private Menu mMenu;         //  field variable    


  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.sell_menu, menu);
    this.mMenu = menu;

    menu.findItem(R.id.action_delete).setVisible(false);
    return super.onCreateOptionsMenu(menu);
  }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.action_delete) {
       // do action
        return true;
    } else if (item.getItemId() == R.id.action_edit) {
      // do action
        return true;
    }

    return super.onOptionsItemSelected(item);
 }

アクティビティで次の2つのメソッドを作成し、フラグメントからそれらを呼び出して、メニュー項目を非表示および表示します。これらの方法は次のとおりです。

public void showDeleteImageOption(boolean status) {
    if (menu != null) {
        menu.findItem(R.id.action_delete).setVisible(status);
    }
}

public void showEditImageOption(boolean status) {
    if (menu != null) {
        menu.findItem(R.id.action_edit).setVisible(status);
    }
}

それは私の側からの解決です、私はこの説明があなたを助けると思います。

0
Sandeep Sankla

質問は古くて答えがありますが。これに対する答えは、上記よりも簡単です。他の変数を使用する必要はありません。可視性(表示/非表示)を行う代わりに、アクションバーに任意のフラグメントを作成してボタンを作成できます。

メニュー項目が必要なものは何でも、フラグメントに以下を追加します。

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

サンプルmenu.xmlファイル:

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
    <item
        Android:id="@+id/action_addFlat"
        Android:icon="@drawable/add"
        Android:showAsAction="ifRoom|withText"
        Android:title="@string/action_addFlat"/>
</menu>

Onclickイベントの処理は通常どおりです。

0
Suresh

パーティーに遅れましたが、上記の答えは私には役に立たなかったようです。

最初のタブフラグメント(内部タブにgetChildFragmentManager()を使用)には、検索アイコンを表示するメニューがあり、Android.support.v7.widget.SearchViewを使用して内部タブフラグメント内を検索しますが、他のタブ(内部タブもあります)に移動しますgetChildFragmentManager())を使用しても検索アイコンは削除されず(必要ではないため)、機能を使用せずにアクセスできます。以下を使用している場合があります(外側のメインタブと各内側タブ)

getChildFragmentManager(); 

ただし、内部タブのgetChildFragmentManager()を含む/使用するフラグメントでは、以下を使用します。

    //region onCreate
    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setRetainInstance(true);

    //access setHasOptionsMenu()
    setHasOptionsMenu(true);

    }
    //endregion onCreate

フラグメントのonPrepareOptionsMenu内のメニュー項目をクリアします(検索アイコンと機能)

    @Override
    public void onPrepareOptionsMenu(Menu menu) {

    super.onPrepareOptionsMenu(menu);

    //clear the menu/hide the icon & disable the search access/function ...
    //this will clear the menu entirely, so rewrite/draw the menu items after if needed
    menu.clear();

    }

うまく機能し、検索アイコン機能を使用してタブ/内部タブに戻ると、検索アイコンと機能が再表示されます。

お役に立てれば...

0
BENN1TH