您的位置:首页 > 移动开发 > Android开发

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

2013-09-08 12:23 381 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: