创建一个菜单布局 :
在需要添加选项菜单的布局对应的activity中创建选项菜单-此时是MainActivity
getMenuInflater().inflate(R.menu.option,menu); // 加载菜单资源
// 创建optionMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 加载菜单资源
getMenuInflater().inflate(R.menu.option,menu);
return true;
}
// 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);
}
在onCreateOptionsMenu 方法里利用以上类添加选项菜单,菜单项序号是指菜单项的位置
// 创建optionMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 加载菜单资源
/* 通过xml设计 */
// getMenuInflater().inflate(R.menu.option,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_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();
}
});