web-dev-qa-db-ja.com

一部のフラグメントでMenuItemを非表示

Fragmentsが多いメニュードロワーを使用しています。一部のFragmentsにはメニュー項目REFRESHがありますが、一部のフラグメントではこのメニュー項目を非表示にしたい(メニューを表示したくないが、ActionBarを非表示にしたくない)。

オーバーライドonCreateOptionsMenu()Fragmentに追加しようとしていますが、このメニュー項目を表示したくないのですが、機能させることができません。私は多くの方法を試してみてください。どこに問題があるのか​​考えていますか?最後に、このメニュー項目は、MainActivityでonPrepareOptionsMenu()と呼ばれるときにメニュードロワーをアクティブにすると非表示になりますが、Fragmentにいるときにこれを行う必要があります。

Fragmentメニュー項目の更新を非表示にする場所:

 public class FindPeopleFragment extends Fragment {
    public FindPeopleFragment(){}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_find_people, container, false);
        //setHasOptionsMenu(false);
        return rootView;
    }

    private Menu menu=null;
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
    {
        inflater.inflate(R.menu.main, menu);
        this.menu=menu;
        menu.findItem(R.id.refresh).setVisible(false);
        getActivity().invalidateOptionsMenu();
        //setHasOptionsMenu(false);
        super.onCreateOptionsMenu(menu,inflater);
    }
}

定義されているMainActivity MENU DRAWER:

 //Slide menu item click listener
private class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
        // display view for selected nav drawer item
        displayView(position);
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // toggle nav drawer on selecting action bar app icon/title
    if (mDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    switch (item.getItemId()) {
        case R.id.refresh:
            Toast.makeText(this, "Refreshing data...", Toast.LENGTH_SHORT).show();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

 // Called when invalidateOptionsMenu() is triggered
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    // if nav drawer is opened, hide the action items
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
    menu.findItem(R.id.refresh).setVisible(!drawerOpen);
    return super.onPrepareOptionsMenu(menu);
}
51
pavol.franek

メニューオプションを表示したくないFragmentでは、次のようにsetHasOptionsMenu(false);onCreate()が必要です。

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

ただし、非表示にするメニュー(REFRESH)はMainActivityに属します。それが常に表示される理由です。メニューをFragmentレベルで制御する(Activityオプションメニューを表示しない)ため、Activityからメニューコードを削除して実装することをお勧めしますFragmentで。

ActivitysとFragmentsにはそれぞれ独自のメニューを設定できます。こちらをご覧ください link

42
Luis

アイテムを非表示にするフラグメント内

@Override
public void onPrepareOptionsMenu(Menu menu) {
    MenuItem item=menu.findItem(R.id.action_search);
    if(item!=null)
       item.setVisible(false);
}

フラグメントのonCreate()

 setHasOptionsMenu(true);
175

これを試してください

@Override 
public void onPrepareOptionsMenu(Menu menu) {
    menu.clear();
}

これをfragmenのonCreate()に配置します

setHasOptionsMenu(true);
29
Sandy Akbar

フラグメントクラス内

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

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        menu.clear();
    }
16

私はそれを使用したいフラグメントでメニュー項目を隠すために以下のコードを使用しました。注:コメントをお読みください

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    Fragment whichFragment=getVisibleFragment();//getVisible method return current visible fragment
    String shareVisible=whichFragment.getClass().toString();
    if(shareVisible.equals(AccFragment.class.toString())
            ||shareVisible.equals(SocFragment.class.toString())
            ||shareVisible.equals(DevFragment.class.toString())
            ){
        MenuItem item=menu.findItem(R.id.action_share);
        item.setVisible(false);
    }
    return super.onCreateOptionsMenu(menu);
}
11
Android27

同様のソリューションにはさまざまなバージョンがありますが、残念ながら、それらのどれも私にとってはうまくいきませんでした。オーバーフローメニュー全体を複数のメニュー項目で非表示にするのに最終的に有用だったものを共有しています。多分それは誰にとっても役立つと思った。

メニューをidでグループ化してから、そのidを参照しました

_@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.setGroupVisible(R.id.menu_overflow, false);
    super.onPrepareOptionsMenu(menu);
}
_

個々のメニュー項目を非表示にする場合は、使用できます

_menu.getItem(R.id.action_licenses).setVisible(false);
_

重要なことは、setOptionsMenu(true)onViewCreated()を含める必要があることです。

_@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setHasOptionsMenu(true);
_
1
Wahib Ul Haq

これらの関数をフラグメントに追加します

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

または、アクティビティレベルでアクションバーをホストする場合、メニューを作成したのと同じフラグメントで解決します。これにより、表示したくない他のすべてのフラグメントに追加する必要がなくなります。

public override void OnDestroy()
{
    base.OnDestroy();
    HasOptionsMenu = false;
}
0
Henk-Martijn