前言:有关Menu的这几篇文章在文章列表中,并不是顺序写的。因为最近学的东西比较多,感想也比较多,单一的写一个方面比较乏味,所以我就穿插着写了,下面我会把相关的链接给大家,供大家系统的学习。
不积跬步无以至千里,不积小流无以成江河。
(千里之行,始于足下,很多人都在抱怨上班后,根本没时间学习,想一想,你每天挤出半小时看书,哪怕,晚上十点钟到家,看半小时书再睡,或者早上早起半小时,不要说没时间,这只是自己懒惰的借口)
系列文章:
1、《Menu详解(一):代码实现系统菜单及子菜单》
2、《Menu详解(二):利用XML生成菜单和子菜单》
3、《Menu详解(三):使用上下文菜单》
什么是上下文菜单
前面我们说了系统菜单,用户只要按android上面的设置键就能调起系统菜单。所以每个页面的系统菜单只能有一个。
而当我们长时间按住某个ListView的Item,或者长时间按住某个EditView控件,弹出来的那个交互菜单,就是上下文菜单。上下文菜单是针对某个控件单独设计的。所以一个页面的上下文菜单可以有很多个,每个控件都可以对应一个,但每个控件也只能有一个上下文菜单。
上下文菜单处理流程
上下文菜单从产生到处理总共需要经过三个流程:
注册-》编写菜单-》针对菜单项处理
1、注册控件
前面说了可以针对每个控件都有一个上下文菜单,但并不是每一个控件都需要上下文菜单啊。我们怎么知道这个控件要不要上下文菜单。所以这就是注册的功能,为需要有上下文菜单的控件注册一下。注册的代码如下:
TextView tvHelloWorld=(TextView)findViewById(R.id.helloword);
registerForContextMenu(tvHelloWorld);//注册上下文菜单
2、产生菜单
在注册上下文菜单以后,所以上按的产生上下文菜单的事件都会分派给onCreateContextMenu()函数来进行处理;先看一下整体产生上下文菜单的代码
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
//根据View来判断当前要产生哪个Menu
if (v==tvHelloWorld) {
menu.add(0, 0, 0, "tv_menu_1");
menu.add(0, 1, 1, "tv_menu_2");
menu.add(0, 2, 2, "tv_menu_3");
menu.add(0, 3, 3, "tv_menu_4");
}
}
在里面先判断当前要产生上下文菜单的View是哪个,然后再产生对应的Menu菜单。这样当长按此控件的时候,就会弹出对应的上下文菜单了。
3、处理菜单项
当某个上下文菜单项被选中时,就会触发onContextItemSelected(MenuItem item) 函数;
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
switch (item.getItemId()) {
case 1:
tvHelloWorld.setText("hello kity");
break;
default:
break;
}
return super.onContextItemSelected(item);
}
同样,这里也是根据ItemId来判断当前选中的是哪个Item,然后做对应处理。
实例:
效果图:
初始界面 长按hello word弹出它的上下文菜单
长按EditView弹出上下文菜单 点击submenu弹出子菜单
首先根据初始化图,大家也能看到,我们在原布局里会增加一个TextView,和一个EditView,布局代码如下:
然后是产生上下文菜单的代码,只不过是上面分部的集合,直接列出来给大家,我就不再细讲了。
public class MainActivity extends Activity {
TextView tvHelloWorld;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvHelloWorld=(TextView)findViewById(R.id.helloword);
editText = (EditText)findViewById(R.id.editText);
registerForContextMenu(tvHelloWorld);//注册上下文菜单
registerForContextMenu(editText);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
//根据View来判断当前要产生哪个Menu
if (v==tvHelloWorld) {
menu.add(0, 0, 0, "tv_menu_1");
menu.add(0, 1, 1, "tv_menu_2");
menu.add(0, 2, 2, "tv_menu_3");
menu.add(0, 3, 3, "tv_menu_4");
}
if (v==editText) {
menu.add(1, 4, 0, "edit_menu_1");
menu.add(1, 5, 1, "edit_menu_2");
menu.add(1, 6, 2, "edit_menu_3");
menu.add(1, 7, 3, "edit_menu_4");
SubMenu sm = menu.addSubMenu(1,8,4,"submenu");
sm.add(2, 11, 1, "submenu_1");
sm.add(2, 12, 2, "submenu_2");
sm.add(2, 13, 3, "submenu_3");
sm.add(2, 14, 4, "submenu_4");
}
}
//根据ID来判断当前是哪个菜单项,所以所有的Item都不要使用相同的ItemID,这样在判断的时候才不会出错
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
switch (item.getItemId()) {
case 1:
tvHelloWorld.setText("hello kity");
break;
default:
break;
}
return super.onContextItemSelected(item);
}
}
这里涉及到子菜单的相关知识,不懂的同学,可以看看这篇文章:《Menu详解(一):代码实现系统菜单及子菜单》
好了,这篇文章就结束了,下面给出源码。
源码下载地址:http://download.csdn.net/detail/harvic880925/7798533
请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38733857 谢谢!