Подтвердить что ты не робот

Скрыть MenuItem в некоторых фрагментах

Я использую ящик меню, у которого больше Fragment s. В некотором Fragment у меня есть пункт меню REFRESH, но в некоторых фрагментах я хочу скрыть этот пункт меню (я не хочу показать меню, но мне не нужно скрывать ActionBar).

Я пытаюсь добавить переопределить onCreateOptionsMenu() в Fragment, где я не хочу показывать этот пункт меню, но я не могу заставить его работать. Я пробую много способов увидеть прокомментированную строку в коде. Есть идеи, где проблема? И последний этот пункт меню исчезает, когда я активирую ящик меню, когда он называется onPrepareOptionsMenu() в MainActivity, но мне нужно сделать это, когда я нахожусь в Fragment.

Fragment, где я хочу скрыть пункт меню REFRESH:

 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, где определено МЕНЮ ЧЕРТЕЖ:

 //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);
}
4b9b3361

Ответ 1

В Fragment, где вы не хотите показывать какие-либо параметры меню, вам нужно setHasOptionsMenu(false); в onCreate(), например:

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

Однако меню, которое отображается, которое вы хотите скрыть (REFRESH), принадлежит MainActivity. Вот почему это всегда проявляется. Поскольку вы хотите управлять меню на уровне Fragment (и не показывать меню опций Activity), мое предложение состоит в том, чтобы удалить код меню из Activity и реализовать его в Fragment.

Activity и Fragment могут иметь свои собственные отдельные меню. См. Ссылку .

Ответ 2

Во фрагменте, где вы хотите спрятать предмет

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

и в onCreate() вашего фрагмента

 setHasOptionsMenu(true);

Ответ 3

попробуйте это

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

и поместите это на свои fragmen onCreate()

setHasOptionsMenu(true);

Ответ 4

В классе фрагментов

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

Ответ 5

Я просто использовал ниже код для скрытия menuitem в fragmnet, где я dnt хочу использовать его. Примечание: Пожалуйста, прочитайте комментарий

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

Ответ 6

Существует много разных версий подобных решений, но, к сожалению, ни один из них не работал у меня. Я делюсь тем, что в конечном итоге было полезно для меня, чтобы скрыть все меню переполнения с несколькими пунктами меню. Думал, может быть, это полезно для всех.

Я сгруппировал свои меню с помощью 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);

Ответ 7

Или решите это в том же фрагменте, который создал меню, если вы размещаете панель действий на уровне активности. Таким образом, вам не нужно добавлять его в каждый другой фрагмент, где вы не хотите его показывать:

public override void OnDestroy()
{
    base.OnDestroy();
    HasOptionsMenu = false;
}

Ответ 8

Добавьте эти функции к вашему фрагменту

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

Ответ 9

Просто найдите элемент, который вы хотите скрыть, используя findItem затем установите его видимость в false.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    MenuItem item = menu.findItem(R.id.action_settings);
    item.setVisible(false);
}