Android --- 菜单 Menu
选项菜单 OptionsMenu
添加menu选项的两种方法
都需要重写 Activity.onCreateOptionsMenu(Menu menu) 添加菜单
用xml添加(更建议使用)
创建一个菜单布局 :
- 在 res文件下新建一个menu 目录,此时的菜单id为:R.menu.option
在需要添加选项菜单的布局对应的activity中重写 onCreateOptionsMenu 方法加载选项菜单-此时是MainActivity
getMenuInflater().inflate(R.menu.option,menu); // 加载菜单资源
// 创建optionMenu @Override public boolean onCreateOptionsMenu(Menu menu) { // 加载菜单资源 getMenuInflater().inflate(R.menu.option,menu); return true; }
使用Java添加
- Menu 类 SubMenu 子菜单类
- Menu类参数:组id 菜单项id 菜单项序号 菜单项名称
重写 onCreateOptionsMenu 方法,利用以上类添加选项菜单,菜单项序号是指菜单项的位置
// 创建optionMenu @Override public boolean onCreateOptionsMenu(Menu menu) { /* 纯代码设计 * Menu 类 SubMenu 子菜单类*/ /* Menu 类参数:组id 菜单项 id 菜单项序号 菜单项名称 */ menu.add(1,1,3,"菜单1"); menu.add(1,2,2,"菜单2"); SubMenu subMenu = menu.addSubMenu(1,3,1,"子菜单的主菜单"); subMenu.add(2,22,1,"子菜单2"); subMenu.add(2,11,2,"子菜单1"); return true; }
两个方法
- 重写 Activity.onCreateOptionsMenu(Menu menu) 添加菜单(见上)
- 重写 Activity.onOptionsItemSelected(@NonNull MenuItem item) 选择某个菜单选项的回调方法,根据id来判断进行的操作
// optionMenu 的选中方法 @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.m1) { Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); } else if (item.getItemId() == R.id.m2) { Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show(); } return super.onOptionsItemSelected(item); }
上下文菜单 ContextMenu
长按按钮弹出菜单
创建菜单布局
- 在 res文件下新建一个menu 目录,此时的菜单id为:R.menu.context
创建菜单
在activity_main.xml里添加一个按钮用以打开上下文菜单
上下文菜单的使用步骤:
1.注册
在 activity_main.xml 布局对应的 activity 中的 onCreate() 方法中进行注册
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ContextMenu 上下文菜单的使用 // 1.注册 registerForContextMenu(findViewById(R.id.ctx_btn)); }
2.创建 - 覆盖父类的 onCreateContextMenu 方法,加载菜单资源
// 2.创建contextMenu @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getMenuInflater().inflate(R.menu.context,menu); }
3菜单项的操作 - 覆盖父类的 onContextItemSelected 方法
// 3.contextMenu 菜单项选项操作 @Override public boolean onContextItemSelected(@NonNull MenuItem item) { int itemId = item.getItemId(); Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show(); return super.onContextItemSelected(item); }
上下文菜单 - 上下文操作模式
菜单会出现在状态栏的位置
1. 实现接口 ActonMode.CallBack 中不同的回调方法
ActionMode.Callback ac =new ActionMode.Callback(){ // 创建:在启动上下文操作模式(startActionMode(Callback))时调用 @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { Log.e("上下文操作模式","--创建--"); getMenuInflater().inflate(R.menu.context,menu); return true; } // 准备:在创建方法后进行调用 @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { Log.e("上下文操作模式","--准备--"); return false; } // 菜单项被点击 @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { /* 环境变量此时需要这样是因为这是一个内部类 ButtonActivity.this */ Log.e("上下文操作模式","--点击--"); Toast.makeText(ButtonActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show(); return true; } // 结束:上下文操作模式结束时调用 @Override public void onDestroyActionMode(ActionMode mode) { Log.e("上下文操作模式","--结束--"); } };
2. 添加一个按钮用以打开,上下文操作模式
3.在View的长按事件中启动上下文操作模式
findViewById(R.id.ctx_opbtn).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { startActionMode(ac); return false; } });
弹出式菜单
一般出现在被绑定的View下方,如果下方没有空间则出现在上方
添加一个按钮
为这个按钮添加点击事件,并将弹出式菜单绑定在按钮的点击事件上
// 将弹出式菜单绑定在按钮的点击事件上 Button popbtn = findViewById(R.id.pop_btn); popbtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 1.实例化 PopupMenu 对象 /* 参数一 上下文环境 * 参数二 被锚定的(绑定)的button*/ PopupMenu popupMenu = new PopupMenu(ButtonActivity.this,popbtn); // 2.加载菜单资源:利用MenuInflater将Menu资源加载到PopMenu.getMenu() 所返回的Menu对象中 popupMenu.getMenuInflater().inflate(R.menu.context,popupMenu.getMenu()); // 3.菜单子项点击操作 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(ButtonActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show(); return false; } }); // 显示菜单 popupMenu.show(); } });
- 在 res文件下新建一个menu 目录,此时的菜单id为:R.menu.context
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。