Google在开发者网站上关于Menu的API指南中为开发者推荐了三种基本的菜单:选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和弹出菜单(PopupMenu)。下面分别给出相应的基本实现步骤。
//创建菜单,加载我们之前定义的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,加载我们之前定义的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);
}
为TextView控件添加android:longClickable属性来响应用户长按点击事件。
"@+id/tv_context_menu"
android:layout_width="160dp"
android:layout_height="60dp"
android:padding="20dp"
android:text="Context Menu"
android:longClickable="true"
android:gravity="center"
/>
将View与ContextMenu绑定。
private TextView mContextMenu;
mContextMenu = findViewById(R.id.tv_context_menu);
registerForContextMenu(mContextMenu);
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();
}
View在xml中的布局。
"@+id/tv_popup_menu"
android:layout_width="160dp"
android:layout_height="60dp"
android:padding="20dp"
android:text="Popup Menu"
android:longClickable="true"
android:gravity="center"
android:background="@drawable/background"
/>
绑定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