Menu详解(三):使用上下文菜单

前言:有关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,布局代码如下:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.testmenu_contextmenu.MainActivity" >

    <TextView
        android:id="@+id/helloword"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" 
        android:background="#ffff00"
        android:layout_marginBottom="20dip"/>
    <EditText 
        android:id="@+id/editText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
  
</LinearLayout>

然后是产生上下文菜单的代码,只不过是上面分部的集合,直接列出来给大家,我就不再细讲了。

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 谢谢!

 

如果你喜欢我的文章,你可能更喜欢我的公众号

启舰杂谈

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值