欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

android开发之使用上下文菜单

来源: 开发者 投稿于  被查看 36268 次 评论:53

android开发之使用上下文菜单


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

 

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

height=640

 

这种效果的实现是使用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 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(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后面添加一个字。

 

 

实现的效果如下图所示:

/

 

 

用户评论