Android里的选项菜单中的项目将出现在操作栏中,用户通过操作栏右侧的操作或者点击设备,菜单按钮来溢出菜单图标。这里介绍 context menu、popup menu 和 option menu 的实现方法。
Context Menu 创建流程 方法1:
1.创建 menu.xml 文件
2.给菜单注册按钮 registerForContextMenu(findViewById(R.id.button_context));
3.创建菜单 @Override onCreateContextMenu
4.菜单项目操作 @Override onContextItemSelected
创建 menu.xml 文件
首先需要在res目录下新建menu文件夹
在xml文件的Design页面中,拖动Palette中的菜单条目到Component Tree中放置,然后在右边的Attribute栏中修改属性值或在Code页面中手动写入id和title属性。
代码实现:
//创建菜单 @Override onCreateContextMenu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.context, menu);
}
//菜单项目操作 @Override onContextItemSelected
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (
item.getItemId()) {
case R.id.delete1 :
makeToast("delete");
break;
case R.id.rename :
makeToast("rename");
break;
case R.id.share :
makeToast("share");
break;
}
return super.onContextItemSelected(item);
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//给菜单注册按钮 registerForContextMenu(findViewById(R.id.button_context));
registerForContextMenu(findViewById(R.id.button_context));
}
长按View后的样式:
Context Menu 创建流程 方法2:
1.创建 menu.xml 文件
2.实现 menu 上下文模式 new ActionMode.Callback()
3.在View的长按事件中启动 menu 上下文操作模式
代码实现:
//在onCreate中:
final ActionMode.Callback callback = 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) {
Log.e("TAG","点击");
switch (menuItem.getItemId()){
case R.id.delete1 :
makeToast("delete");
break;
case R.id.rename :
makeToast("rename");
break;
case R.id.share :
makeToast("share");
break;
}
return true;
}
//上下文操作模式结束时被调用
@Override
public void onDestroyActionMode(ActionMode actionMode) {
Log.e("TAG","结束");
}
};
findViewById(R.id.button_context2).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
startActionMode(callback);
return false;
}
});
长按View后的样式:
Popup Menu 创建流程 :
1.实例化 popupMenu 对象
2.加载菜单资源
3.为PopupMenu设置点击监听器
4.显示PopupMenu
代码实现:
//onCreate中:
//1.实例化PopupMenu对象 (参数2:被锚定的view)
final Button button = findViewById(R.id.button_popup);
final PopupMenu menu = new PopupMenu(this, button);
//2.加载菜单资源:利用MenuInflater将Menu资源加载到PopupMenu.getMenu()所返回的Menu对象中
//将R.menu.xx对于的菜单资源加载到弹出式菜单中
menu.getMenuInflater().inflate(R.menu.context, menu.getMenu());
//3.为PopupMenu设置点击监听器
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.delete1 :
makeToast("delete");
break;
case R.id.rename :
makeToast("rename");
break;
case R.id.share :
makeToast("share");
break;
}
return false;
}
});
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//4.显示PopupMenu
menu.show();
}
});
按View后的样式:
Option Menu 创建流程:
1.重写方法 onCreateOptionsMenu,并加载布局
2.重写方法 onOptionsItemSelected,设置功能
代码实现:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.context, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.delete1 :
makeToast("delete");
break;
case R.id.rename :
makeToast("rename");
break;
case R.id.share :
makeToast("share");
break;
default:
super.onOptionsItemSelected(item);
}
return true;
}
在style.xml定义标题栏的样式和optionMenu的样式
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
</style>
<style name="OverflowMenuStyle" parent="Base.Widget.AppCompat.Light.PopupMenu.Overflow">
<!-- 不让它覆盖 ActionBar -->
<item name="overlapAnchor">false</item>
<item name="android:dropDownVerticalOffset">4dp</item>
<item name="android:dropDownHorizontalOffset">0dp</item>
</style>
</resources>
样式展示: