showAsAction属性值
always:直接在标题栏显示
never:不显示
withText:控制图标和文本一起显示
ifRoom:有空间就显示
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/save"
android:title="保存"
app:showAsAction="always" />
<item
android:id="@+id/setting"
android:title="设置" />
<item android:title="更多">
<menu>
<item
android:id="@+id/exit"
android:title="退出" />
<item android:title="子菜单1" />
</menu>
</item>
</menu>
实现起来相对比较容易,在选中方法里直接用switch
来判断用户点击的是哪一个选项
//创建OptionMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//加载菜单资源
getMenuInflater().inflate(R.menu.option, menu);
return true;
}
//OptionMenu菜单项的选中方法
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.save:
Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show();
break;
case R.id.setting:
Toast.makeText(this, "设置", Toast.LENGTH_SHORT).show();
break;
case R.id.exit:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/delete"
android:title="删除" />
<item
android:id="@+id/rename"
android:title="重命名" />
</menu>
先在onCreate方法中进行注册,绑定某个view
registerForContextMenu(findViewById(R.id.ctx_btn));
创建 覆盖onCreateContextMenu方法
//创建ContextMenu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.context, menu);
}
菜单项的操作 覆盖onContextItemSelected方法
//Context菜单的操作
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show();
break;
case R.id.rename:
Toast.makeText(this, "重命名", Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
实现ActionMode.CallBack方法,并传给对象cb
ActionMode.Callback cb = new ActionMode.Callback() {
//创建,在启动上下文模式(startActionMode(Callback))时调用
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
//这里要返回true
Log.e("TAG", "创建");
getMenuInflater().inflate(R.menu.context, menu);
return true;
}
//在创建方法后调用
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
Log.e("TAG", "准备");
return false;
}
//点击时调用
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
//这里同样要返回true
Log.e("TAG", "点击");
switch (item.getItemId()) {
case R.id.delete:
Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
break;
case R.id.rename:
Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
//上下文操作模式结束时调用
@Override
public void onDestroyActionMode(ActionMode mode) {
Log.e("TAG", "结束");
}
};
在onCreate方法中通过长按监听器启动上下文操作模式
findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
startActionMode(cb);
return false;
}
});
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/copy"
android:title="复制" />
<item
android:id="@+id/paste"
android:title="粘贴" />
</menu>
final Button popBtn=findViewById(R.id.pop_btn);
popBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//实例化PopupMenu对象(参数2:被锚定的view)
PopupMenu menu =new PopupMenu(MainActivity.this,popBtn);
//加载菜单资源:利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中
//将R.menu.xx对应的菜单资源加载到弹出式菜单中
menu.getMenuInflater().inflate(R.menu.popup,menu.getMenu());
//为PopupMenu设置点击监听器
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()){
case R.id.copy:
Toast.makeText(MainActivity.this,"复制",Toast.LENGTH_SHORT).show();
break;
case R.id.paste:
Toast.makeText(MainActivity.this,"粘贴",Toast.LENGTH_SHORT).show();
break;
}
return false;
}
});
//最后要记得show一下
menu.show();
}
});