一个片段中的菜单项 - 与其他片段菜单项混合

时间:2016-03-21 15:03:17

标签: android android-fragments android-optionsmenu

我有一个带有DrawerLayout的Activity和一个RelativeLayout(带有ViewPager和一个FrameLayout作为子对象)和一个ListView作为子对象。当点击DrawerLayout中菜单中的项目时,我在FrameLayout中加载了一个Fragment。

ViewPager加载3个碎片。每个片段都有一个包含3个项目的菜单。在FrameLayout中加载的Fragment包含2个项目的菜单。

问题是,当我在ViewPager和FrameLayout的片段之间切换时,菜单项会相互加起来。

请参阅下面的屏幕截图..

enter image description here

enter image description here

我猜,我在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);
    }

有人可以帮助我理解为什么会发生这种情况,我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

添加menu.clear();在膨胀前的onCreateOptionsMenu中

相关问题