今天在微信公众号看了一篇推送文章,是一个炫酷的menu(菜单)实现方法,自己想了想,好像之前没怎么用过menu,于是今天花点时间,把menu基本用法和各种效果看看书,实现一下,算是基础学习的开始吧。
查了下资料,Android常用的菜单类型主要有:
1).OptionMenu - 选项菜单
2).SubMenu - 子菜单
3).ContextMenu- 上下文菜单
4).PopupMenu - 弹出菜单
下面按顺序用代码的形式依次实现其功能效果
1.OptionMenu - 选项菜单
OptionMenu 作为最常规的菜单,也是出现的最早的菜单,它一般最多只能在界面显示6个菜单选项,如果超过六个,则第6个菜单会以more menu选项的形式展示
实现方法:
1).在java文件中以代码形式实现
2).在menu的xml文件中实现
两种方法都需要熟悉,但我更倾向于第一种,所以这里给出java文件中以代码形式实现OptionMenu
首先需要定义菜单项:
//定义菜单项 private static final int item1=Menu.FIRST; private static final int item2=Menu.FIRST+1; private static final int item3=Menu.FIRST+2; private static final int item4=Menu.FIRST+3; private static final int item5=Menu.FIRST+4;然后在antivity中重写OncreateoptionsMenu(Menu menu)方法,将menu对象调用add()方法来把菜单项添加进来
add()方法主要有四个:
add(charSequence title);
add(int groupId ,int itemId,int order,charsequence title);第一个参数表示组号,便于后面管理菜单选项;第二个是菜单项的编号;第三个是菜单项显示顺序,默认为 0,为菜单项添加的顺序;第四个是菜单的标题
add(int groupId ,int itemId,int order,int titleRes);前三个参数同上,第四个表示标题的资源id
add(int titleRes);
最常用的是第二个方法:
public boolean onCreateOptionsMenu(Menu menu) { menu.add(0,item1,1,"音乐"); menu.add(0,item2,2,"视频"); menu.add(0,item3,3,"小说"); menu.add(0,item4,4,"游戏"); //添加子菜单 SubMenu subMenu=menu.addSubMenu(1,item5,5,"新闻"); subMenu.add(2,item6,1,"娱乐新闻"); subMenu.add(2,item7,2,"军事新闻"); return true; }submenu的添加方法与其如出一辙,不详细说明了。既然菜单项做好了,那么还需要什么呢?不错,是它们的响应事件。
通过重写方法onOptionItemSelected()实现响应的监听:
public boolean onOptionsItemSelected(MenuItem item) {//重写菜单响应方法 switch (item.getItemId()){ case item1: Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); break; case item2: Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); break; case item3: Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); break; case item4: Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); break; case item5: Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); break; case item6: Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); break; case item7: Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); break; } return true; }至于运行效果就算了,我手机是魅族,没有菜单按键了= =
2.SubMenu子菜单上面也已经一并介绍用法了,这里就跳过了
3.ContextMenu- 上下文菜单
ContextMenu- 上下文菜单属于一种很常用的菜单类型,它与OptionMenu的不同之处在于:optionMenu的拥有者是Activity,而contextMenu的拥有者是view,所以,我们可以通过长按响应view来调出contextMenu。
首先写一个控件来调用并注册上下文菜单:
private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView= (TextView) findViewById(R.id.test); registerForContextMenu(textView); }
然后添加上下文菜单项:
//添加上下文菜单项 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { menu.add(0,1,1,"新建"); menu.add(0,2,2,"删除"); menu.add(0,3,3,"修改"); menu.add(0,4,4,"查找"); super.onCreateContextMenu(menu, v, menuInfo); }最后加上菜单项的监听:
//菜单项响应 @Override public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo adapterContextMenuInfo= (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()){ case 1: Toast.makeText(this,item.getItemId(),Toast.LENGTH_SHORT).show(); break; case 2: Toast.makeText(this,item.getItemId(),Toast.LENGTH_SHORT).show(); break; case 3: Toast.makeText(this,item.getItemId(),Toast.LENGTH_SHORT).show(); break; case 4: Toast.makeText(this,item.getItemId(),Toast.LENGTH_SHORT).show(); break; } return true; }附上效果图:
3..PopupMenu - 弹出菜单
PopupMenu也是响应view操作的,在点击该view后会弹出菜单,而不像前者一样需要长按。
下面直接上代码了,关于popupmenu用法可以和popupwindow比较起来使用,推荐一偏它们的博客:http://blog.youkuaiyun.com/a379992210/article/details/48423923
textView.setOnClickListener(this);//为textview设置监听器
//点击事件的监听
运行后,点击textview,效果如下:public void onClick(View v) { switch (v.getId()){ case R.id.test: PopupMenu popupMenu=new PopupMenu(this,textView); MenuInflater menuInflater=popupMenu.getMenuInflater(); menuInflater.inflate(R.menu.main_menu,popupMenu.getMenu());//获取menu的文件 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()){ case R.id.item1: //do things break; case R.id.item2: //do things break; } return false; } }); popupMenu.show(); break; }
关于menu的基本知识学习笔记就记录到这了,后面会根据情况不定时拓展相关用法和实现。
小结:
1).menu的两种实现方式:代码实现和xml实现
2).熟悉add()方法中参数的含义和作用
3).上下文菜单---contextMenu用法比较灵活,会与listview联系起来使用,注意它们的用法和灵活性
4).popupMenu与popipWindow的使用区别与效果区别
5).多加注意代码的规范性和方法的封装性
补充:本文仅作记录和参考,如有问题或者好的改进建议欢迎大家提出来,谢谢。