触发条件
上下文菜单的拥有者是View,用户每一次长按View时被调用,而且View必须已经注册了上下文菜单。
创建和响应上下文菜单步骤
1.为一个view注册上下文菜单:registerForContextMenu(View view)
2.生成上下文菜单,重写方法:onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
3.点击菜单选项,重写响应方法:onContextItemSelected(MenuItem item)
Demo
简单写了个demo,满足基本功能:
1.注册上下文,显示列表
布局就一个Listview,不再贴了~
MainActivity
public class MainActivity extends Activity {
private ListView lvFiels;
private String[] files;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvFiels = (ListView)findViewById(R.id.lv_file);
showFileList();
//注册上下文菜单
registerForContextMenu(lvFiels);
}
private void showFileList() {
files = new String[]{"文件1","文件2","文件3","文件4"};
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, files);
lvFiels.setAdapter(adapter);
}
}
2.生成上下文菜单
先自定义一个menu菜单:file_menu.xml,放在res/menu文件夹下。
file_menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/copy" android:title="@string/menu_copy" />
<item android:id="@+id/cut" android:title="@string/menu_cut" />
<item android:id="@+id/delete" android:title="@string/menu_delete" />
<item android:id="@+id/rename" android:title="@string/menu_rename" />
</menu>
MainActivity:重写onCreateContextMenu方法
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.file_menu, menu);
//获取点击listview位置
AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
String titleString = files[info.position];
//设置标题
menu.setHeaderTitle(titleString);
}
3.响应上下文菜单点击
MainActivity:重写onContextItemSelected方法
@Override
public boolean onContextItemSelected(MenuItem item) {
//获取点击listview位置
//AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
//int position = info.position;
switch (item.getItemId()) {
case R.id.copy:
//do something
Toast.makeText(this, "copy", Toast.LENGTH_SHORT).show();
return true;
case R.id.cut:
//do something
return true;
case R.id.rename:
//do something
return true;
case R.id.delete:
//do something
return true;
default:
return super.onContextItemSelected(item);
}
}