Android菜单详解——上下文菜单(ContextMenu )

1,长按菜单,就会弹出一个菜单,这个菜单就称为上下文菜单。上下文菜单不同于选项菜单,选项菜单服务于Activity,而上下文菜单则是注册到某个View对象上的。如果一个View对象注册了上下文菜单,用户可以通过长按该View对象以呼出上下文菜单。

2,ContextMenu创建方法:

a)首先给View注册上下文菜单registerForContextMenu()

b)添加上下文菜单内容onCreateContextMenu()

——可以通过代码动态添加;

——也可以加载xml文件中的菜单项;

c)设置菜单点击后响应事件onContextMenuItemSelected()

3,首先在布局文件中添加一个ListView:


    
    

4,然后在MainActivity中设置ListView的显示内容和构造ListView的数据,还要在showListView()方法中给view注册上下文菜单:

   

  /*
     *1, 设置listview显示的内容
     */
    private void showListView() {

    ListView listView=(ListView) findViewById(R.id.lv);
    ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,getData());
    listView.setAdapter(adapter);
    //给view注册上下文菜单
        this.registerForContextMenu(listView);
}
    /*
     *2, 构造listview显示的数据
     */
    private ArrayListgetData(){
    ArrayListlist=new ArrayList();
    for (int i = 0; i <5; i++) {
list.add("文件"+(i+1));
}
return list; 
}

5,最后设置menu显示的内容以及设置菜单项的点击事件:

   

 
 /*
     * 3,设置menu显示的内容
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
    ContextMenuInfo menuInfo) {
    
	    super.onCreateContextMenu(menu, v, menuInfo);
	    menu.setHeaderTitle("文件操作");
	    menu.setHeaderIcon(R.drawable.ic_launcher);
	    /*
	    * add方法中有四个参数(groupId,itemId,order,title)
	    *groupId为分组的Id,itemId为菜单项的Id,order为菜单排序,title为菜单项的文字描述
	    */
	    menu.add(1, 1, 1, "复制");
	    menu.add(1, 2, 1, "粘贴");
	    menu.add(1, 3, 1, "剪切");
	    menu.add(1, 4, 1, "重命名");
    }
    /*
     *4, 重写菜单项的点击事件
     */
    @Override
    public boolean onContextItemSelected(MenuItem item) {
    
    switch (item.getItemId()) {
		case 1:
			Toast.makeText(this, "点击复制", Toast.LENGTH_SHORT).show();
			break;
		case 2:
			Toast.makeText(this, "点击粘贴", Toast.LENGTH_SHORT).show();
			break;
		case 3:
			Toast.makeText(this, "点击剪切", Toast.LENGTH_SHORT).show();
			break;
		case 4:
			Toast.makeText(this, "点击重命名", Toast.LENGTH_SHORT).show();
			break;
		}
    	return super.onContextItemSelected(item);
    }

 
  

6,下面是MainActivity的完整代码:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //把listview显示出来
        showListView();      
    }
    /*
     *1, 设置listview显示的内容
     */
    private void showListView() {

    ListView listView=(ListView) findViewById(R.id.lv);
    ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,getData());
    listView.setAdapter(adapter);
    //给view注册上下文菜单
    this.registerForContextMenu(listView);
    }
    /*
     *2, 构造listview显示的数据
     */
    private ArrayListgetData(){
    ArrayListlist=new ArrayList();
    for (int i = 0; i <5; i++) {
    	list.add("文件"+(i+1));
	}
    return list; 
    }
    /*
     * 3,设置menu显示的内容
     */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
    ContextMenuInfo menuInfo) {
    
	    super.onCreateContextMenu(menu, v, menuInfo);
	    menu.setHeaderTitle("文件操作");
	    menu.setHeaderIcon(R.drawable.ic_launcher);
	    /*
	    * add方法中有四个参数(groupId,itemId,order,title)
	    *groupId为分组的Id,itemId为菜单项的Id,order为菜单排序,title为菜单项的文字描述
	    */
	    menu.add(1, 1, 1, "复制");
	    menu.add(1, 2, 1, "粘贴");
	    menu.add(1, 3, 1, "剪切");
	    menu.add(1, 4, 1, "重命名");
    }
    /*
     *4, 重写菜单项的点击事件
     */
    @Override
    public boolean onContextItemSelected(MenuItem item) {
     
    switch (item.getItemId()) {
		case 1:
			Toast.makeText(this, "点击复制", Toast.LENGTH_SHORT).show();
			break;
		case 2:
			Toast.makeText(this, "点击粘贴", Toast.LENGTH_SHORT).show();
			break;
		case 3:
			Toast.makeText(this, "点击剪切", Toast.LENGTH_SHORT).show();
			break;
		case 4:
			Toast.makeText(this, "点击重命名", Toast.LENGTH_SHORT).show();
			break;
		}
    	return super.onContextItemSelected(item);
    }
}

7,上面的实例是通过代码动态添加菜单内容,也可以通过加载xml文件中的菜单项来添加菜单内容,在layout的menu中添加布局:



    
    
    
    


8,通过加载xml文件中的菜单项来添加菜单内容时,MainActivity中的代码只需修改两处:

第一:onCreateContextMenu方法中通过inflater来获取menu显示的内容:

ManuInflater  inflater=getMenuInflater();

inflater.inflate(R.menu.main,menu);

第二:在点击事件onContextItemSelected中,要把ItemId中的id改为menu中每个item对应的id。

9,实现结果:

Android菜单详解——上下文菜单(ContextMenu )_第1张图片

你可能感兴趣的:(android)