一、选项菜单OptionMenu
是一个应用的主菜单项,用于放置对应用产生全局影响的操作
1、在res中新建一个menu类型的Resource DireDirection
2、新建Resource File
3、添加item
<item android:title="保存"/>
<item android:title="设置"/>
在菜单item中添加子菜单
<item android:title="保存"/>
<item android:title="设置"/>
<item android:title="更多操作">
<menu >
<item android:title="Item" />
</menu>
</item>
创建OpitionMenu
使用该方法指定opiton.xml指定为菜单文件
getMenuInflater()返回一个MenuInflater对象而其中有一个inflate,传入option,并传入menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//加载菜单资源
getMenuInflater().inflate(R.menu.option,menu);
return true;
//要return true 否则不显示
}
menu item有很多其他功能
<item android:title="保存"
android:icon="@mipmap/ic_launcher"
app:showAsAction="ifRoom"/>
app:showAsAction可以将其直接放在操作栏
always一直放置在操作栏
ifRoom如果有空间的时候放在功能栏
设置icon并且showAsAction时图片会显示在功能栏,如果只设置icon将没有任何效果
添加id并实现onOpitionsItemSelected可以为选择MenuItem提供
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.save:
Toast.makeText(MainActivity.this,"保存",Toast.LENGTH_SHORT).show();
break;
case R.id.setting:
Toast.makeText(MainActivity.this,"设置",Toast.LENGTH_SHORT).show();
break;
case R.id.exit:
Toast.makeText(MainActivity.this,"退出",Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
二、上下文菜单ContextMenu
长按某个view不放,就会在屏幕弹出ContextMenu
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1、注册
registerForContextMenu(findViewById(R.id.ctx_btn));
}
//2、与option累次
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.context,menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
//item的点击与option相同
return super.onContextItemSelected(item);
}
为按钮设置上下文操作模式
1、实现ActionMode CallBack
2、在view的长按事件中启动上下文操作模式
使用上下文操作模式与以前的代码无关
ActionMode.Callback cb = new ActionMode.Callback() {
//创建方法,在启动上下文操作模式(startActionMode(CallBack))时调用)
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
Log.e("TAG","创建");
getMenuInflater().inflate(R.menu.context,menu);
return true;
}
//在创建方法后进行调用
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
Log.e("TAG","准备");
return false;
}
//菜单项被点击
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.del:
Toast.makeText(MainActivity.this,"del",Toast.LENGTH_SHORT).show();
break;
case R.id.rename:
Toast.makeText(MainActivity.this,"rename",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
//在上下文操作模式结束时被调用
@Override
public void onDestroyActionMode(ActionMode actionMode) {
}
};
设置长按点击时间来启动上下文模式
findViewById(R.id.ctx_btn).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
startActionMode(cb);
return false;
}
});
长按后菜单会出现在上方
三、PopupMenu 弹出菜单
一个模态形式展示的弹出风格的菜单,绑在某个View上,一般出现在被绑定的View的下方
//popupMenu
final Button popupbtn = findViewById(R.id.popup_btn);
findViewById(R.id.popup_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//实例化popupMenu对象
PopupMenu menu = new PopupMenu(MainActivity.this,popupbtn);
//加载菜单资源:利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中
menu.getMenuInflater().inflate(R.menu.popou,menu.getMenu());
//为popupmenu设置点击监听器
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.copy:
Toast.makeText(MainActivity.this, "copy", Toast.LENGTH_SHORT).show();
break;
case R.id.paste:
Toast.makeText(MainActivity.this, "paste", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
//!!!
menu.show();
}
});