菜单(Menu):是app中不可缺少的重要组成部分,贯穿整个app;
Android菜单分为3中类型:选项菜单(OptionMenu),上下文菜单(ContextMenu),弹出菜单(PopupMenu);
OptionMenu 对应的是一个activity,一个activity只能有一个OptionMenu,ContextMenu,PopupMenu对应的事VIew
activity中得每一个View都可以有对应的ContextMenu,PopupMenu;
可以在xml文件中进行菜单的编辑(推荐),也可以使用Java代码进行菜单的编辑(除非有特殊要求);
一:选项菜单(OptionMenu)
效果图:
选项菜单的创建:
1.xml菜单文件编写
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/app_bar_search" android:icon="@android:drawable/ic_menu_search" android:title="查找" app:showAsAction="collapseActionView|ifRoom" /> <item android:id="@+id/it_new" android:title="新建" /> <item android:id="@+id/it_save" android:title="保存" /> <item android:id="@+id/it_more" android:title="更多" > <menu > <item android:id="@+id/it_rename" android:title="重命名" /> <item android:id="@+id/it_delete" android:title="删除" /> </menu> </item> </menu>
其中ShowAsAction是菜单的显示方式:always 始终显示在界面上 never 不显示在界面上,显示在(...)的列表中
ifRoom 有空间则显示在界面上,没有则显示在列表中,
2.在Java代码中重写OnCreatOptionMenu;
//创建OptionMenu @Override public boolean onCreateOptionsMenu(Menu menu) { //加载菜单资源,参数1:菜单资源索引 参数2:所要绑定菜单的对象 getMenuInflater().inflate(R.menu.option, menu); //记得return true 否者菜单无法显示 return true; }
3..重写 onOptionItemSelected 设置点击事件
//OptionMenu菜单选中项的方法 @Override public boolean onOptionsItemSelected(MenuItem item) { // item.getItemId(); 获取选中项ID switch (item.getItemId()) { case R.id.app_bar_search: Toast.makeText(MainActivity.this, "查找", Toast.LENGTH_LONG).show(); break; case R.id.it_new: Toast.makeText(MainActivity.this, "新建", Toast.LENGTH_LONG).show(); break; case R.id.it_delete: Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_LONG).show(); break; case R.id.it_more: Toast.makeText(MainActivity.this, "更多", Toast.LENGTH_LONG).show(); break; case R.id.it_rename: Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_LONG).show(); break; case R.id.it_save: Toast.makeText(MainActivity.this, "保存", Toast.LENGTH_LONG).show(); } return super.onOptionsItemSelected(item); }
二:上下文菜单(ContextMenu)
1.xml菜单编写,新建xml文件(),可以是多个View对应不同的xml,也可以相同的xml
2.在Java中注册对应的view
//1.注册contextMenu,与控件进行绑定 registerForContextMenu(findViewById(R.id.button1));
3.重写OnCreatContextMenu
//覆盖onCreateContextMenu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { //加载菜单资源 getMenuInflater().inflate(R.menu.context_menu, menu); }
4.重写OnContextItemSelected 设置点击事件
//f覆盖onContextItemSelected @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.ct_copy: Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_LONG).show(); break; case R.id.ct_delete: Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_LONG).show(); break; case R.id.ct_rename: Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_LONG).show(); break; } return super.onContextItemSelected(item); }
为按钮设置上下文操作模式:在顶部进行上下文操作
1.实现ActionMode CallBack
//①实现ActionMde CallBack,实例化对象 ActionMode.Callback cb = new ActionMode.Callback() { //创建,在启动上下文模式操作(startActionMode(CallBack))时调用 @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { getMenuInflater().inflate(R.menu.context_menu,menu); return true; } //在创建方法后被调用 @Override public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { return false; } //菜单项操作 @Override public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.ct_copy: Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_LONG).show(); break; case R.id.ct_delete: Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_LONG).show(); break; case R.id.ct_rename: Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_LONG).show(); break; } return false; } //操作模式结束时调用,操作栏消失即调用 @Override public void onDestroyActionMode(ActionMode actionMode) { } };
2.为view添加长按操作,启动上下文操作模式
②在View的长按中启动上下文操作模式 findViewById(R.id.button2).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { startActionMode(cb);//启动上下文操作模式 return false; } });
三:弹出菜单,在View的下方显示
1.同样建立xml 菜单文件
2.在Java中为View添加点击事件
//button3 演示popup menu final Button button = findViewById(R.id.button3); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //1.实例化popupMenu对象 参数1.环境上下文 参数2,popupMenu依附的控件,出现在哪个控件的下方 PopupMenu pm = new PopupMenu(MainActivity.this,button); //2.加载菜单资源,利用MenuInflater pm.getMenuInflater().inflate(R.menu.popur,pm.getMenu()); //3.为PopupMenu创建监听器 pm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.pp_copy: Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_LONG).show(); break; case R.id.pp_delete: Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_LONG).show(); break; } return false; } }); //4.千万不要忘了这一步 pm.show(); } });
注意:最后要调用show()方法,否则菜单无法显示
上面都是通过建立xml菜单资源文件,进行调用建立菜单,下面使用Java代码进行菜单的编写
@Override public boolean onCreateOptionsMenu(Menu menu) { //参数1:组Id 参数2:菜单Id 参数3:菜单在列表中显示的序号id 参数4:菜单提示 menu.add(1,101,1,"查找"); menu.add(1,102,1,"新建"); SubMenu sub = menu.addSubMenu(1,103,3,"更多"); sub.add(2,201,1,"复制"); sub.add(2,202,2,"粘贴"); return true; }
在进行点击事件的创建时,只需要将viewid改成菜单id即可
@Override public boolean onOptionsItemSelected(MenuItem item) { // item.getItemId(); 获取选中项ID switch (item.getItemId()) { case 101: Toast.makeText(MainActivity.this, "查找", Toast.LENGTH_LONG).show(); break; case 102: Toast.makeText(MainActivity.this, "新建", Toast.LENGTH_LONG).show(); break; } }