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

Android菜单介绍

2014-07-28 14:37 381 查看
选项菜单,点击手机Menu键弹出的菜单。

1,菜单的基本用法:

1.1 OptionsMenu 选项菜单(按Menu键弹出的菜单)

Activity的onCreateOptionsMenu事件方法创建选项菜单

通过menu.add添加选项菜单项,返回一个MenuItem。

public MenuItem add(int groupId,int itemId,int order,CharSequence title);

如果groupId、itemId、order省略,默认都是0,显示顺序按添加顺序显示。

1.2 带图像的选项菜单

通过add方法返回的MenuItem的方法setIcon()设置图片

1.3 管理Activity

MenuItem的setItent()方法

注意:如果设置了菜单项的单击事件,并且单击事件返回true,则setIntent方法失效。

1.4 响应菜单的单击动作

通过调用MenuItem的setOnMenuItemClickListener方法可以设置菜单项的单击事件。

还可以使用Activity类的onOptionsItemSelected和onMenuItemSelected方法来响应菜单项的单击事件。这两个方法都有一个MenuItem参数,可以使用其getTitle和getItemId方法来判断单击的是哪个菜单项。

既 然有3种方法响应菜单项单击事件的方法,就会产生一个问题?如果同时使用这3种方法,他们都会起作用吗?如果都起作用那调用顺序又是如何呢?实际上,当 onMenuItemClick方法返回true时,另两种单击事件的响应方式都会失效;如果没有设置onMenuItemClickListener,
系统会根据在onMenuItemSelected方法中调用父类的onMenuItemSelected方法的位置来决定先调用 onOptionsItemSelected方法还是先调用onMenuItemSelected方法。

也就是说super.onMenuItemSelected(featureId,item);调用了onOptionsItemSelected方法

1.5 动态添加、修改和删除选项菜单

实现这个功能的关键是获得描述选项菜单的Menu对象。

Activity类中的很多方法都可以获得Menu对象。例如,onCreateOptionsMenu方法的menu参数,我们要做的就是在onCreateOptionMenu方法中将Menu对象保存在类变量中。

1.6 带复选框和选项按钮的子菜单

Menu.addSubMenu方法用来添加子菜单。该方法有4种重载形式:

SubMenu addSubMenu(final int gourpId,final int itemId,int order,final CharSequence title);

SubMenu是Menu的子接口,添加SubMenu后,可以通过SubMenu.add方法添加其子菜单项。在子菜单项上不能显示图像,但可以在子菜单的头部显示图像,不过子菜单项可以带复选框和选项按钮。

例如:

SubMenu fileSubMenu=menu.addSubMenu(1,1,2,"文件"); //添加SubMenu

fileSubMenu.setIcon(R.drawable.file); //设置在选项菜单中显示的图像

fileSubMenu.setHeaderIcon(R.drawable.headerfile); //设置子菜单头的图像

MenuItem newMenuItem=fileSubMenu.add(1,2,2,"新建");

newMenuItem.setCheckable(true); //将第一个子菜单项设置成复选框类型

newMenuItem.setChecked(true); //选中第一个子菜单项中的复选框

MenuItem openMenuItem=fileSubMenu.add(2,3,3,"打开");

MenuItem exitMenuItem=fileSubMenu.add(2,4,4,"退出");

exitMenuItem.setChecked(true); //将第3个子菜单项的选项按钮设置为选中状态

fileSubMenu.setGroupCheckable(2,true,true);//将后两个子菜单项设置成选项按钮类型

在编写上面代码时应注意以下几点:

1)添加子菜单并不是直接在MenuItem下添加菜单项,而需要使用addSubMenu方法创建一个SubMenu对象。

2) 将子菜单项设置成复选框类型,需要使用MenuItem.setCheckable方法。但设置成选项按钮类型,不需要使用setCheckable方 法,而要将同一组的选项按钮的groupI的设置成相同的值,同时使用setGroupCheckable方法来设置这个groupId。该方法的第1个
参数是指定子菜单项的groupId,第2个参数必须为true。如果第3个参数为true,相同groupId的子菜单项会被设置成选项按钮效果;如果 为false,相同groupId的子菜单项会被设置成复选框效果。根据相同groupId设置的选项按钮和复选框除了显示效果,并没有什么其他的不同。 其代表的含义完全由开发人员决定。

3)使用setChecked方法可以将复选框或选项按钮设置成选中状态。

4)选项菜单不支持嵌套子菜单。否则将抛出异常。

1.7 上下文菜单

上下文菜单有些和子菜单类似,也分为菜单头和菜单项。

通过onCreateContextMenu方法创建上下文菜单。

可以使用ContextMenu.setHeaderTitle和ContextMenu.setHeaderIcon方法设置上下文菜单头的标题和图像。上下文菜单项也是不能显示图像,但可以带复选框和选项按钮。也不支持嵌套。

上下文菜单必须注册到指定的View上才能显示。注册上下文菜单可以使用Activity.registerForContextMenu方法。

例如:registerForContextMenu(button);

上下文菜单项的单击事件也可以使用单击事件类和onMenuItemSelected方法来响应,还有覆盖

Activity.onContextItemSelected方法

1.8 菜单事件

Activity类还有一些与菜单相关的事件方法,这些方法的定义如下:

public boolean onPrepareOptionsMenu(Menu menu);

public void onOptionsMenuClosed(Menu menu);

public void onContextMenuClosed(Menu menu);

public boolean onMenuOpened(int featureId,Menu menu);

这些方法的含义如下:

1)onPrepareOptionsMenu:在显示选项菜单之前调用。一般用来修改即将显示的选项菜单。

2)onOptionsMenuClosed:在关闭选项菜单时被调用。

3)onContextMenuClosed:在关闭上下文菜单时被调用。

4)onMenuOpened:在显示选项菜单之前被调用。该方法在onPrepareOptionsMenu方法之后调用。

6.1.9 从菜单资源中装载菜单

在res\menu目录中的文件才菜单资源文件。

<menu xmlns:android="...">

<item ...

<item ..

</menu>

使用 getMenuInflater().inflate(R.menu.file_menu,menu); 加载

2 菜单特效

2.1 自定义菜单

系统提供的菜单看起来有些“土”,通过onKeyDown和PopupWindow实现自定义的菜单。

首先写一个布局文件准备给PopupWindow使用。

然后监听“menu”键和“back”键按下动作。

1)按下back键时,如果选项菜单已经弹出,则关闭选项菜单。

2)如果选项菜单未弹出,则执行super.onKeyDown

@Override

public boolean onKeyDown(int keyCode,KeyEvent event)

{

switch (keyCode)

{

case KeyEvent.KEYCODE_MENU: //如果按下“menu”键

if (state==1) //自定义的state表示状态,1表示选项菜单已弹出

return false;

//装载选项菜单布局文件

layout=getLayoutInflater().inflate(R.layout.menu_layout,null);

pop=new PopupWindow(layout,getWindowManager().getDefaultDisplay().getWidth(),getWindowManager().getDefaultDisplay().getHeight());

//设置弹出窗口的位置

pop.showAcLocation(layout,Gravity.BOTTOM,0,0);

View home=layout.findViewById(R.id.home);

home.seonClickListener(...);

...

pop.dismiss();

...

state=2;

return false;

case KeyEvent.KEYCODE_BACK:

if (state==1) ...

else ...

2.2 模拟UCWeb效果菜单

通过onCreateOptionsMenu和onMenuOpened两个方法相互配合来弹出自定义菜单。

在显示选项菜单之前,系统会调用onMenuOpened方法,如果该方法返回false,则不再显示选项菜单。因此,可以在onMenuOpened方法中弹出用于显示自定义菜单的窗口。

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

//必须构建一项,否则系统不会调用onMenuOpened方法

menu.add("menu");

return super.onCreateOptionsMenu(menu);

}

@Override

public boolean onMenuOpened(int featureId,Menu menu)

{

if (popup!=null) {

if (popup.isShowing())

{

popup.dismiss();

}

else

{

View layout=getLayoutInflater().inflate(R.layout.main,null);

//popup.showAtLocation(layout,Gravity.CENTER,0,0);

}

return false;

}

2.3 QuickContactBadge与联系人菜单

我们在使用Android内置的联系人功能时发现,在单击某个联系人之后,会弹出一个可以选择的图像菜单,其中包括拨打电话、发短信等功能。

这 个功能实际上是由QuickContactBadge控件完成的。QuickContactBadge是ImageView的子类,因 此,QuickContactBadge完全可以作为一个ImageView来使用。但QuickContactBadge还可以查询系统的联系人列表, 并根据联系人的相关信息显示如图6.12所示的快捷菜单。现在我们先在布局文件中放两个QuickContactBadge控件。

<?xml version...>

<LinearLayout ...>

<QuickContactBadge ... android:src="http://supershll.blog.163.com/blog/@drawable/ic_contact_picture" style="?android:attr/quickContactbadgeStyleWindowSmall"
/>

<QuickContactBadge ... style="?android:attr/quickContactbadgeStyleWindowLarge" />

</LinearLayout>

style属性指定了显示图像菜单的风格。如果quickContactBadgeStyleWindowLarge风格可以显示联系人的姓名,quickContactBadgeStyleWindowSmall风格只显示图像菜单。

部分示例代码:

String select="(("+Contacts.DISPLAY_NAME+" NOTNULL) AND ("+Contacts.HAS_PHONE_NUMBER+"=1) AND ("+Contacts.DISPLAY_NAME+" !='' ))";

//查询所有的联系人

Cursor cursor=getContentResolver().query(Contacts.CONTENT_URI,CONTACTS_SUMMARY_PROJECTION,select,null,Contacts.DISPLAY_NAME+" COLLATE LOCALIZED
ASC");

//将记录指针移动到第一条记录

cursor.moveToFirst();

//创建第一个QuickContactBadge对象

QuickContactBadge badge1=findViewById(R.id.badge1);

... badge2=...;

//获得联系人的ID

long contactId=cursor.getLong(cursor.getColumnIndex(Contacts._ID));

//获得联系人的Lookup_key

String lookupKey=cursor.getString(cursor.getColumnIndex(Contacts.LOOKUP_KEY));

//将联系人与QuickContactBadge关联

badge1.assignContactUri(Contacts.getLookupUri(contactId,lookupKey));

cursor.moveToNext();

contactId=....;

lookupKey=...

badge2.assignContactUri(...);

注意:QuickContactBadge控件并不会自动显示联系人的图像,要想显示图像,需要像ImageView一样设置src属性、

扩展学习:除了使用QuickContactBadge.assignContactUri方法关联联系人外,还可以使用

QuickContactBadge.assignContactFromEmail(String emailAddress,boolean lazyLookup)关联Email

QuickContactBadge.assignContactFromPhone(String phoneNumber,boolean lazyLookup) 关联电话号码

如 果lazyLookup为true,并不会立即通过Email或Phone查找联系人,直接QuickContactBadge控件被单击。如果有多个联 系人使用了同一个电话或Email,则只显示第一个查到的联系人信息。使用这两个方法与联系人关联,单击QuickContactBadge控件并不会显
示图像菜单,而会直接跳到联系人界面。

本文转自:http://www.cnblogs.com/carbs/archive/2012/07/10/2585237.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: