1 选项菜单——OptionMenu
1.1 基本使用
- 在
res
目录下创建menu
目录,并且创建menu
资源文件。
- 插入菜单项
<?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:title="menuItem1" />
<item android:title="menuItem2" >
<menu >
<item android:title="Item21" />
<item android:title="Item22" />
</menu>
</item>
</menu>
- 在
activity
中创建OptionMenu,重写onCreateOptionsMenu()
方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.option_menu, menu);
return true;
}
1.2 常用属性
<item>
标签属性- 设置成
always
会使得该菜单项直接显示在标题栏上
- 如果设置了图标,则不显示文字,直接显示图标
- 设置成
<item android:title="menuItem1"
app:showAsAction="always"
android:icon="@mipmap/ic_launcher"/>
1.3 为菜单项添加响应事件
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.m1:
Toast.makeText(this, "m1", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return true;
}
注:最多允许含有一层子菜单
2 上下文菜单——ContextMenu
- 长按某个view而弹出的菜单,称为上下文菜单
2.1 使用
- 使用
registerForContextMenu()
方法将上下文菜单注册到某个view上
Button btn = findViewById(R.id.button_context);
registerForContextMenu(btn);
- 创建菜单,重写
onCreateContextMenu()
方法
@Override
public void onCreateContextMenu(android.view.ContextMenu menu, View v, android.view.ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.context_menu, menu);
}
- 菜单项的操作,重写
onContextItemSelected()
方法即可,具体做法与选项菜单的代码相同。
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
...
...
}
- 效果
2.2 实现上下文操作模式
- 不同于2.1节中的实现方式,本节中是通过view的长按事件来实现的,具体步骤如下:
- 实现
ActionModeCallBack
接口
ActionMode.Callback cb = new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
getMenuInflater().inflate(R.menu.context_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
...
...
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
};
onCreateActionMode()
:在启动时调用,在这里指定菜单资源onPrepareActionMode()
:创建完成后调用此方法onActionItemClicked()
:添加菜单的点击事件,跟之前的一样onDestroyActionMode()
:上下文操作模式结束时被调用
- 在view的长按事件中启动上下文操作模式
findViewById(R.id.button_context).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
startActionMode(cb);
return false;
}
});
此时,菜单项会出现在顶部的标题栏中
3 弹出式菜单——PopupMenu
- 弹出式菜单是指单击view后弹出的菜单,因此绑定到view的单击事件中即可,一般包含以下步骤:
- 绑定单机事件
- 实例化
PopupMenu
对象 - 加载菜单资源
- 设置点击监听器
final Button popupBtn = findViewById(R.id.button_popup);
popupBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 参数2:锚定的view
PopupMenu menu = new PopupMenu(ContextMenu.this, popupBtn);
// 将资源文件加载到menu上
menu.getMenuInflater().inflate(R.menu.context_menu, menu.getMenu());
// 添加响应事件
// 最重要的是调用show方法
menu.show();
}
});
- 最终效果,单击按钮时显示如下菜单