• android开发之使用上下文菜单


    android中的上下文菜单类似于PC上的鼠标右键单击,不同的是android上没有鼠标这一概念,更谈不上右键单击,在android中,一般是长按某个View,调出上下文菜单。与OptionsMenu不同的是,ContextMenu是一个针对View的菜单,它绑定在某一个View上,而OptionsMenu是属于一个Activity的。


    现在大部分浏览器都有长按复制的功能,如下图:


    这种效果的实现是使用PopupWindow来实现的(关于PopupWindow的使用可以参见我的另一篇文章popupWindow使用详解
    ),虽然它和我们即将要说的ContextMenu很像。


    好了,说了这么多,我们该说说怎么实现上下文菜单了。

    实现上下文菜单一共三个步骤:

    1.重写Activity或者Fragment中的onCreateContextMenu方法:

    	@Override
    	public void onCreateContextMenu(ContextMenu menu, View v,
    			ContextMenuInfo menuInfo) {
    		super.onCreateContextMenu(menu, v, menuInfo);
    		menu.setHeaderTitle("你想干啥?");
    		menu.setHeaderIcon(R.drawable.a4c);
    		menu.add(0, 0, Menu.NONE, "复制");
    		menu.add(0, 1, Menu.NONE, "剪贴");
    		menu.add(0, 2, Menu.NONE, "重命名");
    		menu.add(1, 3, Menu.NONE, "去新的Activity");
    	}


    2.重写Activity或者Fragment中的onContextItemSelected方法,实现菜单事件监听

    	@Override
    	public boolean onContextItemSelected(MenuItem item) {
    		switch (item.getItemId()) {
    		case 0:
    			tv.setText(item.getTitle().toString());
    			break;
    		case 1:
    			tv.setText(item.getTitle().toString());
    			break;
    		case 2:
    			tv.setText(item.getTitle().toString());
    			break;
    		case 3:
    			tv.setText(item.getTitle().toString());
    			startActivity(new Intent(this, SecondActivity.class));
    			break;
    		default:
    			return super.onContextItemSelected(item);
    		}
    		return true;
    	}

    3.给View注册上下文菜单

    tv = (TextView) this.findViewById(R.id.tv);
    		this.registerForContextMenu(tv);

    三个步骤实现了给一个TextView注册了上下文菜单事件,有时候我们会遇到另外情况,比如说要给ListView中的每一项都添加上下文菜单,而且当我们长按ListView该项的时候,我们还希望能够知道我们点击的是哪一个item,这个该怎么实现呢?AdapterContextMenuInfo专为解决这个问题而生,看看先下面的代码:

    public class SecondActivity extends Activity {
    
    	private ListView lv;
    	private String[] menuStrs;
    	private ArrayAdapter<String> adapter;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_second);
    		lv = (ListView) this.findViewById(R.id.lv);
    		initListView();
    		this.registerForContextMenu(lv);
    	}
    
    	private void initListView() {
    		menuStrs = new String[] { "庆历四年春", "滕子京谪守巴陵郡", "越明年", "政通人和" };
    		adapter = new ArrayAdapter<String>(this,
    				android.R.layout.simple_list_item_1, menuStrs);
    		lv.setAdapter(adapter);
    	}
    
    	@Override
    	public void onCreateContextMenu(ContextMenu menu, View v,
    			ContextMenuInfo menuInfo) {
    		super.onCreateContextMenu(menu, v, menuInfo);
    		menu.setHeaderTitle("你想干啥?");
    		menu.setHeaderIcon(R.drawable.a4c);
    		menu.add(0, 0, Menu.NONE, "岳");
    		menu.add(0, 1, Menu.NONE, "阳");
    		menu.add(0, 2, Menu.NONE, "楼");
    		menu.add(1, 3, Menu.NONE, "记");
    	}
    
    	@Override
    	public boolean onContextItemSelected(MenuItem item) {
    		AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item
    				.getMenuInfo();
    		switch (item.getItemId()) {
    		case 0:
    			menuStrs[menuInfo.position] += "岳";
    			break;
    		case 1:
    			menuStrs[menuInfo.position] += "阳";
    			break;
    		case 2:
    			menuStrs[menuInfo.position] += "楼";
    			break;
    		case 3:
    			menuStrs[menuInfo.position] += "记";
    			break;
    		default:
    			return super.onContextItemSelected(item);
    		}
    		adapter.notifyDataSetChanged();
    		return true;
    	}
    }

    前面的东西都很简单,我就不多说了,通过AdapterContextMenuInfo的实例我们可以拿到我们所点击item的position,id等,我们这里实现的一个效果就是点击上下文菜单之后在每个item View后面添加一个字。


    实现的效果如下图所示:



    Demo下载https://github.com/lenve/contextMenu



    版权声明:本文为博主原创文章,未经博主允许不得转载。若有错误地方,还望批评指正,不胜感激。

  • 相关阅读:
    【WebService】WebService之WSDL文档深入分析(三)
    Android开发——发布第三方库到JitPack上
    Android破解学习之路(七)—— 乐秀视频编辑 内购破解 专业版 价值40元的破解
    Android破解心得——记学习七少月安卓大型安全公开课
    【转】Android播放音频MediaPlayer的几种方式介绍
    Android开发——EditText的属性使用
    Android开发——Fragment的简单使用总结
    Android开发——签名包的生成
    Android Stuido xml使用app属性没有提示代码
    Android开发——设置界面的创建
  • 原文地址:https://www.cnblogs.com/lenve/p/4925900.html
Copyright © 2020-2023  润新知