DrawerMenu所遇到的坑

来源:互联网 发布:php支持多线程吗 编辑:程序博客网 时间:2024/05/10 23:18

项目中遇到应用侧滑菜单的需求很正常,这篇文章记录使用侧滑菜单的一些坑,基于NavigationLayout,主要为一下两个坑:

  • 如何定义Navigation菜单项
  • 如何动态改变Navigation菜单项

如何定义Navigation菜单项

首先定义要引用的menu.xml文件,一般由三种元素组成
menu, item, group

menu是根元素。item是子元素,表示menu中的一个菜单项,但其中可以继续嵌套menu,表示子菜单项。group表示具有相同行为的一组菜单项,比如把单击后保持选中状态的菜单项放在一个group中。

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android">    <group        android:id="@+id/noteBook"        android:orderInCategory="0"        android:checkableBehavior="single">        <item            android:orderInCategory="0"            android:id="@+id/all"            android:icon="@mipmap/ic_speaker_notes_black_24dp"            android:title="All" />    </group>    <group        android:id="@+id/operation"        android:orderInCategory="1">        <item            android:orderInCategory="1"            android:id="@+id/setting"            android:icon="@drawable/ic_menu_share"            android:title="Settings" />        <item            android:orderInCategory="1"            android:id="@+id/edit"            android:icon="@drawable/ic_menu_send"            android:title="Edit Notebooks" />    </group></menu>

这是一个简单的例子,一个menu下面有两个group,第一个group具有行为android:checkableBehavior=”single”,表示单击后保持item的选中状态。除此之外,我们还注意到有这么一个属性android:orderInCategory=”1”,通过这个属性我们可以为菜单项归类,表示这几个菜单项是属于第一类的,那几个是属于第二类的,这个操作为下面动态改变item打下基础。

如何动态改变Navigation菜单项改变

改变分两点,(不包括改变item的title属性之类的,相信大家都会),增加和删除

增加菜单项

这个例子很好的演示了如何动态的通过代码增加菜单项,大家可以看看。

看懂上面的例子,基本就会增加菜单项,但是菜单项的位置可能还要学习一下。
下面是我google的时候看到的一个很好的解释指导。

删除菜单

删除菜单项要先得到菜单项的id才能删除,如果只是menu.xml的菜单项还好说,我们可以之前定义好他们的id号,但是要是通过上述方式动态添加的item怎么办?

解决办法就是我们给动态增加的菜单项都指定一个相同Id号,然后删掉再添加。

下面是我的一个代码片段和运行效果:

    private class NavMenuHolder{        private Menu menu;        private ArrayList<String> item;        public NavMenuHolder(Menu menu, ArrayList item){            this.menu = menu;            this.item = new ArrayList<>();            item.add("ALL");        }        public Menu getMenu(){            return menu;        }        public ArrayList getItem(){            return item;        }    }    private class PopulateMenu extends AsyncTask<NavMenuHolder, Void, NavMenuHolder>{        @Override        protected NavMenuHolder doInBackground(NavMenuHolder... params) {            //Handle the menu to keep the peace in sqlite            NavMenuHolder navMenuHolder = params[0];            ArrayList list = navMenuHolder.getItem();            //read from the sqlite to add the string list of notebook into the list            list.addAll(DataBaseManager.getInstance(getApplicationContext()).getBookList());            return navMenuHolder;        }        @Override        protected void onPostExecute(NavMenuHolder navMenuHolder) {            super.onPostExecute(navMenuHolder);            //set up the NavigationDrawer menu            Menu menu = navMenuHolder.getMenu();            ArrayList list = navMenuHolder.getItem();            Toast.makeText(MainActivity.this, menu.getItem(menu.size() - 3).getTitle().toString(), Toast.LENGTH_SHORT).show();            //delete the menu first before we assign a new list            while(menu.getItem(1).getItemId() == 925865936){                menu.removeItem(925865936);            }            for(int i = 0; i < list.size(); i++){                //add note to the menu group and set icon, assign a unique ID                menu.add(R.id.noteBook, 925865936, 0, list.get(i).toString())                        .setIcon(R.mipmap.ic_speaker_notes_black_24dp);            }        }    }

这里写图片描述
这里写图片描述

ps: 如何在一开始就选中某个菜单:
这个有个很好的解释指导。

navigationView.getMenu().getItem(0).setChecked(true);
0 0
原创粉丝点击