概述
Google在开发者网站上关于Menu的API指南中为开发者推荐了三种基本的菜单:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和弹出菜单(PopupMenu)。下面分别给出相应的基本实现步骤。
选项菜单(OptionsMenu)
效果图
实现步骤:
1、在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件。
2、在要显示OptionMenu的Activity里面重写onCreateOptionsMenu和onOptionsItemSelected方法。
//创建菜单,加载我们之前定义的menu_main.xml布局文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main,menu);
return true;
}
//当OptionsMenu被选中的时候处理具体的响应事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.action_1:
Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
return true;
case R.id.action_2:
Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
return true;
case R.id.action_3:
Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
return true;
default:
//do nothing
}
return super.onOptionsItemSelected(item);
}
上下文菜单(ContextMenu)
效果图
实现步骤
1、在res下面创建一个menu文件夹,并新建一个xml文件作为ContextMenu的布局文件(这里我们复用上面OptionsMenu的布局文件)。
2、在要显示ContextMenu的Activity里面重写onCreateContextMenu和onContextItemSelected方法。
//创建ContextMenu,加载我们之前定义的menu_main.xml布局文件
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.menu_main, menu);
}
//当ContextMenu被选中的时候处理具体的响应事件
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.action_1:
Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
return true;
case R.id.action_2:
Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
return true;
case R.id.action_3:
Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
return true;
default:
//do nothing
}
return super.onContextItemSelected(item);
}
3、为控件添加长按响应属性,并绑定这个控件。
为TextView控件添加android:longClickable属性来响应用户长按点击事件。
将View与ContextMenu绑定。
private TextView mContextMenu;
mContextMenu = findViewById(R.id.tv_context_menu);
registerForContextMenu(mContextMenu);
弹出菜单(PopupMenu)
效果图
实现流程
1、在res下面创建一个menu文件夹,并新建一个xml文件作为PopupMenu的布局文件(这里我们复用上面OptionsMenu的布局文件)。
2、把PopupMenu相关逻辑封装到showPopupMenu()方法中,包含PopupMenu的实例化、布局设置、显示、添加MenuItem的点击监听及响应等。
private void showPopupMenu(){
PopupMenu popupMenu = new PopupMenu(this,mPopupMenu);
popupMenu.inflate(R.menu.menu_main);
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.action_1:
Toast.makeText(mContext,"Option 1",Toast.LENGTH_SHORT).show();
return true;
case R.id.action_2:
Toast.makeText(mContext,"Option 2",Toast.LENGTH_SHORT).show();
return true;
case R.id.action_3:
Toast.makeText(mContext,"Option 3",Toast.LENGTH_SHORT).show();
return true;
default:
//do nothing
}
return false;
}
});
popupMenu.show();
}
3、与View绑定,当点击这个View的时候显示PopupMenu。
View在xml中的布局。
绑定View,点击显示。
private TextView mPopupMenu;
mPopupMenu = findViewById(R.id.tv_popup_menu);
mPopupMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showPopupMenu();
}
});
小结
通过比较发现,前两种方法实现起来是比较简单的,Activity中已经为我们提供了创建和响应的回调方法,我们只需要在创建菜单时把布局文件传递进去,然后在响应方法中实现对应项要做的事就可以了。不像第三种方法需要额外自己去创建实例并实现MenuItem的点击监听。在默认显示的位置上,OptionsMenu显示在右上角ActionBar的位置,ContextMenu能显示在控件视图范围内任何被点击的位置,PopupMenu与被点击控件左下角对齐显示。从三种菜单的实现效果图可以看出,默认的菜单显示样式是一样的。
菜单的实现方式不止这三种,更多的方法可以参看Android中的菜单实现汇总,开发者可以根据自己项目的需要选择适合自己的方法实现菜单。
Demo