Пункты меню в одном фрагменте - перепутаны с пунктами меню других фрагментов

У меня есть Activity с DrawerLayout и RelativeLayout (с ViewPager и FrameLayout в качестве дочерних для него) и ListView в качестве дочерних элементов. Я загружаю фрагмент внутри FrameLayout, когда щелкают элемент в меню внутри DrawerLayout.

ViewPager загружает 3 фрагмента. Каждый Фрагмент имеет меню с 3 пунктами. Фрагмент, загружаемый внутри FrameLayout, имеет меню с двумя элементами.

Проблема в том, что когда я переключаюсь между ViewPager и фрагментом FrameLayout, пункты меню добавляются друг к другу.

Пожалуйста, обратитесь к скриншотам ниже..

введите здесь описание изображения

введите здесь описание изображения

Я предполагаю, что я делаю что-то неправильно в методах onCreateOptionsMenu, onOptionsItemSelected или onPrepareOptionsMenu.

Методы деятельности:

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (item.getItemId() == android.R.id.home) {

            if (mDrawerLayout.isDrawerOpen(mDrawerLeft)) {
                mDrawerLayout.closeDrawer(mDrawerLeft);
            } else {
                mDrawerLayout.openDrawer(mDrawerLeft);
            }
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        return super.onPrepareOptionsMenu(menu);
    } 

Один из фрагментов ViewPager: два других также похожи:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_all, menu);

        SearchManager searchManager = (SearchManager) activity.
                getSystemService(Context.SEARCH_SERVICE);
        searchMenuItem = menu.findItem(R.id.ic_action_search);
        searchView = (SearchView) searchMenuItem.getActionView();

        searchView.setSearchableInfo(searchManager.
                getSearchableInfo(activity.getComponentName()));
        searchView.setOnQueryTextListener(this);

        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (item.getItemId() == R.id.action_list) {
            prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.LIST_VIEW).apply();
            mStaggeredLayoutManager.setSpanCount(1);
        } else if (item.getItemId() == R.id.action_grid) {
            prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.GRID_VIEW).apply();
            mStaggeredLayoutManager.setSpanCount(2);
        } else if (item.getItemId() == R.id.action_mini) {
            prefs.edit().putString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.MINI_VIEW).apply();
            mStaggeredLayoutManager.setSpanCount(1);
        }

        ActivityCompat.invalidateOptionsMenu(activity);
        mViewPagerPetitionsRecyclerViewAdapter.notifyDataSetChanged();
        mIMainAllPetitionsListener.onLayoutChangedListener();

        return super.onOptionsItemSelected(item);
    }

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

        MenuItem list_item = menu.findItem(R.id.action_list);
        MenuItem grid_item = menu.findItem(R.id.action_grid);
        MenuItem mini_item = menu.findItem(R.id.action_mini);

        String item_type = prefs.getString(Const.VIEWPAGER.VIEW_TYPE, Const.VIEWPAGER.LIST_VIEW);

        if (item_type.equalsIgnoreCase(Const.VIEWPAGER.LIST_VIEW)) {
            list_item.setChecked(true);
            grid_item.setChecked(false);
            mini_item.setChecked(false);
        } else if (item_type.equalsIgnoreCase(Const.VIEWPAGER.GRID_VIEW)) {
            list_item.setChecked(false);
            grid_item.setChecked(true);
            mini_item.setChecked(false);
        } else if (item_type.equalsIgnoreCase(Const.VIEWPAGER.MINI_VIEW)) {
            list_item.setChecked(false);
            grid_item.setChecked(false);
            mini_item.setChecked(true);
        }
    }

Фрагмент FrameLayout:

@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_id_card, menu);

        MenuItem menuItem = menu.findItem(R.id.edit);
        menuItem.setVisible(false);

        super.onCreateOptionsMenu(menu, inflater);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        int id = item.getItemId();

        if (id == R.id.action_share) {
            shareIDCard();
        } else if (id == R.id.action_save_as_image) {
            saveAsImage();
        } else if (id == R.id.action_save_as_wallpaper) {
            SaveAsWallPaper();
        } else if (id == R.id.edit) {
            setEnabled(true);
            isEditable = true;
            ActivityCompat.invalidateOptionsMenu(activity);
        } else if (item.getItemId() == R.id.save) {

            ....
            ActivityCompat.invalidateOptionsMenu(activity);
        } else if (item.getItemId() == R.id.cancel) {
            ...
            ActivityCompat.invalidateOptionsMenu(activity);
        }

        return super.onOptionsItemSelected(item);
    }

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

        MenuItem menuItemEdit = menu.findItem(R.id.edit);
        MenuItem menuItemSave = menu.findItem(R.id.save);
        MenuItem menuItemCancel = menu.findItem(R.id.cancel);
        ....

        menuItemEdit.setVisible(false);
        menuItemSave.setVisible(false);
        menuItemCancel.setVisible(false);
    }

Может ли кто-нибудь помочь мне понять, почему это происходит и что я могу сделать, чтобы это исправить?


person Vamsi Challa    schedule 21.03.2016    source источник


Ответы (1)


Добавить меню.clear(); в вашем onCreateOptionsMenu перед надуванием

person Honza Musil    schedule 21.03.2016
comment
Это приводит к сбою приложения во фрагментах ViewPager. - person Vamsi Challa; 21.03.2016
comment
Что за выброшенное исключение? - person Honza Musil; 21.03.2016