Android入门笔记之菜单 (选项菜单和上下文菜单)

Android入门笔记之菜单(选项菜单和上下文菜单)

<1>简介

选项菜单和上下文菜单都是一个android应用必备的部分。

<2>关键步骤

       选项菜单:通过覆盖Activity中的public boolean onCreateOptionsMenu(Menumenu)生成,并通过public boolean onOptionsItemSelected(MenuItem mi)实现事件监听。

       上下文菜单:通过覆盖Activity中的public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 生成,并通过public boolean onContextItemSelected(MenuItem mi) 实现事件监听。 

<3>出现的问题

<4>代码及解释


MenuActivity.java:

package com.ui.menu;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.SubMenu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.test.R;

public class MenuActivity extends Activity{
	/**   
	 * @ProjectName:  [androidtest] 
	 * @Package:      [com.ui.menu.MenuActivity.java]  
	 * @ClassName:    [MenuActivity]   
	 * @Description:    
	 * @Author:       [gmj]   
	 * @CreateDate:   [2013-9-8 上午10:50:09]   
	 * @Version:      [v1.0] 
	 */
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);
        //为两个文本框注册上下文菜单
        this.registerForContextMenu(findViewById(R.id.menuText2));
        this.registerForContextMenu(findViewById(R.id.menuText3));
        Button btn = (Button) findViewById(R.id.menubutton); 
        btn.setOnCreateContextMenuListener(this); 
    }
	
    final int MENU1=1;//每个菜单项目的编号=======begin=========
    final int MENU2=2;
    final int MENU3=3;
    final int MENU4=4;
    final int MENU5=5;//每个菜单项目的编号=======end============
    
    final int MENU_GENDER_MALE=0;    //每个菜单项目的编号=======begin=========
    final int MENU_GENDER_FEMALE=1;
    final int MENU_HOBBY1=2;
    final int MENU_HOBBY2=3;
    final int MENU_HOBBY3=4;
    final int MENU_OK=5;    
    final int MENU_GENDER=6;  
    final int MENU_HOBBY=7;         //每个菜单项目的编号=======end============
    
    final int GENDER_GROUP=0;      //性别子菜单项组的编号
    final int HOBBY_GROUP=1;  	   //爱好子菜单项组的编号
    final int MAIN_GROUP=2;        //外层总菜单项组的编号
    
    MenuItem[] miaHobby=new MenuItem[3];//爱好菜单项组
    MenuItem male=null;//男性性别菜单项
    
    //获取当前选择状态的方法
    public void appendStateStr()
    {
    	String result="您选择的性别为:";
    	if(male.isChecked())
    	{
    		result=result+"男";
    	}
    	else
    	{
    		result=result+"女";
    	}
    	
    	String hobbyStr="";
    	for(MenuItem mi:miaHobby)
    	{
    		if(mi.isChecked())
    		{
    			hobbyStr=hobbyStr+mi.getTitle()+"、";
    		}
    	}
    	
    	if(hobbyStr.length()>0)
    	{
    		result=result+",您的爱好为:"+hobbyStr.substring(0, hobbyStr.length()-1)+"。\n";
    	}
    	else
    	{
    		result=result+"。\n";
    	}
    	EditText et=(EditText)this.findViewById(R.id.menuText1);               
		et.append(result);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
    	//性别单选菜单项组   菜单若编组就是单选菜单项组    	
    	SubMenu subMenuGender = menu.addSubMenu(MAIN_GROUP,MENU_GENDER,0,"gender");
    	subMenuGender.setIcon(R.drawable.img1);
    	male=subMenuGender.add(GENDER_GROUP, MENU_GENDER_MALE, 0, "male");
    	male.setChecked(true);
    	subMenuGender.add(GENDER_GROUP, MENU_GENDER_FEMALE, 0, "female");
    	//设置GENDER_GROUP组是可选择的,互斥的
    	subMenuGender.setGroupCheckable(GENDER_GROUP, true,true); 
    	
    	//爱好复选菜单项组
    	SubMenu subMenuHobby = menu.addSubMenu(MAIN_GROUP,MENU_HOBBY,0,"hobby");
    	subMenuHobby.setIcon(R.drawable.img2); 
    	miaHobby[0]=subMenuHobby.add(HOBBY_GROUP, MENU_HOBBY1, 0, "hobby1");
    	miaHobby[1]=subMenuHobby.add(HOBBY_GROUP, MENU_HOBBY2, 0, "hobby2");
    	miaHobby[2]=subMenuHobby.add(HOBBY_GROUP, MENU_HOBBY3, 0, "hobby3");
    	miaHobby[0].setCheckable(true);//设置菜单项为复选菜单项
    	miaHobby[1].setCheckable(true);
    	miaHobby[2].setCheckable(true);
    	
    	//确定菜单项
    	MenuItem ok=menu.add(MAIN_GROUP,MENU_OK,0,"ok");
    	OnMenuItemClickListener lsn=new OnMenuItemClickListener()
    	{//实现菜单项点击事件监听接口
			@Override
			public boolean onMenuItemClick(MenuItem item) {
				appendStateStr();
				return true;
			}    		
    	};
    	ok.setOnMenuItemClickListener(lsn);//给确定菜单项添加监听器    	
    	//给确定菜单项添加快捷键
    	ok.setAlphabeticShortcut('o');//设置字符快捷键
    	//ok.setNumericShortcut('1');//设置数字快捷键
    	//ok.setShortcut('a', '2');//同时设置两种快捷键
    	//要注意,同时设置多次时只有最后一个设置起作用
    	
    	return true;
    }
    
    @Override  //单选或复选菜单项选中状态变化后的回调方法
    public boolean onOptionsItemSelected(MenuItem mi)
    {
    	switch(mi.getItemId())
    	{
    	   case MENU_GENDER_MALE://单选菜单项状态的切换要自行写代码完成
    	   case MENU_GENDER_FEMALE:
    		    mi.setChecked(true); 
    		    appendStateStr();//当有效项目变化时记录在文本区中
    	   break;   
    	   
    	   case MENU_HOBBY1://复选菜单项状态的切换要自行写代码完成
    	   case MENU_HOBBY2:
    	   case MENU_HOBBY3:
    	       mi.setChecked(!mi.isChecked());
    	       appendStateStr();//当有效项目变化时记录在文本区中
    	   break;    	 
    	}    	    	
    	return true;
    }
    
    @Override
    public void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
    {//此方法在每次调出上下文菜单时都会被调用一次
    	if(v==findViewById(R.id.menubutton))
    	{//若是第一个文本框
    		menu.add(0, MENU1, 0, "菜单项1");
    		menu.add(0, MENU2, 0, "菜单项2");
    		menu.add(0, MENU3, 0, "菜单项3");
    	}else if(v==findViewById(R.id.menuText2))
    	{//若是第一个文本框
    		menu.add(0, MENU1, 0, "菜单项1");
    		menu.add(0, MENU2, 0, "菜单项2");
    		menu.add(0, MENU3, 0, "菜单项3");
    	}
    	else if(v==findViewById(R.id.menuText3))
    	{//若是第二个文本框
    		menu.add(0, MENU4, 0, "菜单项4");
    		menu.add(0, MENU5, 0, "菜单项5");
    	}
    }
    
    @Override  //菜单项选中状态变化后的回调方法
    public boolean onContextItemSelected(MenuItem mi)
    {	
		switch(mi.getItemId())
		{
		  case MENU1:
		  case MENU2:
		  case MENU3:
			  EditText et1=(EditText)this.findViewById(R.id.menuText2);               
			  et1.append("\n"+mi.getTitle()+" 被按下");  
		  break;
		  case MENU4:
		  case MENU5:
			  EditText et2=(EditText)this.findViewById(R.id.menuText3);               
			  et2.append("\n"+mi.getTitle()+" 被按下");  
		  break;
		}    	
    	return true;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值