介绍
ContextMenu 即上下文菜单,是通过长按(1.5s)界面上的某个控件弹出的菜单。
控件必须注册了 ContextMenu 以后,长按才会弹出 ContextMenu ,注册方式为调用registerForContextMneu(View)
方法。
【配置菜单】
参考 OptionMenu,重写 onCreateContextMenu()
方法,在该方法中,第 1 个参数用于创建菜单项,第 2 个参数 View v 表示长按哪个控件弹出的 ContextMenu,第 3 个参数通常不需要使用,仅当为 AdapterView 配置了 ContextMenu 后,可以将第 3 个参数向下转型为 AdapterContextMenuInfo 的对象,然后获取相关信息,如 position 等。
【响应菜单项的点击】
参考 OptionMenu,重写 onContextItemSelected
xml创建ContextMenu
menu 下创建菜单布局 main.xml
<?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/action_copy"
android:orderInCategory="100"
android:title="Copy"
app:showAsAction="never" />
</menu>
MenuActivity.java
public class MenuActivity extends AppCompatActivity {
private View tv;
private View img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
tv = findViewById(R.id.textView);
img = findViewById(R.id.imageView);
//注册上下文菜单
registerForContextMenu(tv);
registerForContextMenu(img);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.main, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_copy:
Toast.makeText(this, "点击了Copy", Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
}
MenuActivity 的布局就是一个 TextView 和一个 ImageView
运行程序:
动态创建ContextMenu
public class MenuActivity extends AppCompatActivity {
private View tv;
private View img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
tv = findViewById(R.id.textView);
img = findViewById(R.id.imageView);
//注册上下文菜单
registerForContextMenu(tv);
registerForContextMenu(img);
}
public static final int MENU_ITEM_COPY_TEXT = 1;
public static final int MENU_ITEM_SAVE_TO_FILE = 2;
public static final int MENU_ITEM_EDIT_IMAGE = 3;
public static final int MENU_ITEM_RESEND_IMAGE_ = 4;
@Override
public void onCreateContextMenu(ContextMenu menu,
View v,//长按哪个控件弹出的菜单
ContextMenu.ContextMenuInfo menuInfo) {
switch (v.getId()) {
case R.id.textView:
menu.add(Menu.NONE, 1, Menu.NONE, "复制文字");
menu.add(Menu.NONE, 2, Menu.NONE, "保存到文件");
break;
case R.id.imageView:
menu.add(Menu.NONE, 3, Menu.NONE, "编辑图片");
menu.add(Menu.NONE, 4, Menu.NONE, "转发图片");
break;
}
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case MENU_ITEM_COPY_TEXT:
Toast.makeText(this, "点击了 复制文字", Toast.LENGTH_SHORT).show();
break;
case MENU_ITEM_SAVE_TO_FILE:
Toast.makeText(this, "点击了 保存到文件", Toast.LENGTH_SHORT).show();
break;
case MENU_ITEM_EDIT_IMAGE:
Toast.makeText(this, "点击了 编辑图片", Toast.LENGTH_SHORT).show();
break;
case MENU_ITEM_RESEND_IMAGE_:
Toast.makeText(this, "点击了 转发图片", Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
}
运行程序: