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

Android第四十一天

2016-07-25 21:34 405 查看
1.概念

<1>Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(OptionMenu)。

<2>从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。

2、分类

<1>OptionsMenu按手机menu弹出的菜单

(1)重写publicbooleanonCreateOptionsMenu(menu)方法

//显示弹出菜单布局必须要重写的方法,在这个地方加载菜单文件
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
getMenuInflater().inflate(R.menu.main,menu);
setIconEnable(menu,true);
//必须要返回true
returntrue;
}


(2)创建菜单项MenuItem

a.创建菜单XML文件,必须以<menu>为根标签

菜单XML的位置:/res/menu/

<item>标签属性

android:id表示item的id

android:icon表示菜单的图标,4.0系统仅在ActionBar上显示图标

android:title表示菜单的文字

二级子菜单

<?xmlversion="1.0"encoding="utf-8"?>
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:id="@+id/file"
android:title="@string/file">
<!--"file"的子菜单-->
<menu>
<itemandroid:id="@+id/create_new"
android:title="@string/create_new"/>
<itemandroid:id="@+id/open"
android:title="@string/open"/>
</menu>
</item>
</menu>


二级组菜单

<item
android:id="@+id/menu_group2"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字颜色">
<menu>
<group>
<itemandroid:id="@+id/font_red"android:title="red"/>
<itemandroid:id="@+id/font_green"android:title="green"></item>
<itemandroid:id="@+id/font_blue"android:title="blue"></item>
<itemandroid:id="@+id/font_yellow"android:title="yellow"></item>
</group>
</menu>
</item>


二级可选组菜单

<item
android:id="@+id/menu_group1"
android:orderInCategory="1"
android:showAsAction="never"
android:title="文字尺寸">
<menu>

<!--android:checkableBehavior属性有三个可选值:all为多选,single为单选,none为不可选。为none时就是一个普通菜单-->

<groupandroid:checkableBehavior="single">
<itemandroid:id="@+id/font_10"android:title="10sp"></item>
<itemandroid:id="@+id/font_15"android:title="15sp"></item>
<itemandroid:id="@+id/font_20"android:title="20sp"></item>
<itemandroid:id="@+id/font_25"android:title="25sp"></item>
<itemandroid:id="@+id/font_30"android:title="30sp"></item>
</group>
</menu>
</item>


通过MenuInflater.inflater(intmenuId,menu)方法将菜单项追加到菜单中

b.menu.add()方法增加菜单

menu.add()方法返回MenuItem对象

setIcon(inticonRes)

setTitle(CharSequencetitle)

setOnMenuItemClickListener(OnMenuItemClickListener)

setIntent(Intent)设置点击菜单项时打开的窗口

menu.add(CharSequence):一般使用方法,增加菜单名称

menu.add(0,1,1,"拍照")

第一个参数为GroupID,Group即将菜单项分组

第二个参数为ItemID,指的是菜单项的id

第三个参数为order,指定菜单项的位置顺序

第四个参数为title,指的是菜单项所显示的文字

(3)重写publicbooleanonOptionsItemSelected(MenuItemitem)方法,实现菜单项的选择事件

//要做弹出菜单的点击事件必须重写的方法
@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
//获取被点击的菜单的id
intid=item.getItemId();
switch(id){
caseR.id.item2:
Toast.makeText(this,"清除"+item.getTitle(),Toast.LENGTH_SHORT).show();
break;
caseR.id.item3:
Toast.makeText(this,"杀毒"+item.getTitle(),Toast.LENGTH_SHORT).show();
break;
caseR.id.item4:
Toast.makeText(this,"拨号"+item.getTitle(),Toast.LENGTH_SHORT).show();
break;

default:
break;
}
returnsuper.onOptionsItemSelected(item);
}


<2>ContextMenu长按绑定UI控件的上下文菜单(上下文菜单继承自android.view.Menu)

(1)上下文菜单与OptionsMenu最大的不同在于:

OptionsMenu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View;

每个Activity最多只有一个OptionsMenu,它为整个Activity服务。而一个Activity往往有多个View,哪个View需要上下文菜单就通过registerForContextMenu(Viewview)给这个View注册上下文菜单。

(2)生成上下文菜单是通过Activity中的onCreateContextMenu()方法:

onCreateContextMenu(ContextMenumenu,Viewv,ContextMenu.ContextMenuInfomenuInfo)方法很像生成OptionsMenu的onCreateOptionsMenu(Menumenu)方法;

两者的不同在于:onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按注册了上下文菜单的View时被调用。

(3)ContextMenuInfo有什么用呢?

当视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的id等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。

ContextMenuInfo携带了注册上下文菜单控件的一些额外信息。一般用在AdaterViews(例如:Spinner、ListView或GridView)上,可以在ContextMenuInfo中获取到适配器View中的position的信息。

(4)开发上下文菜单的步骤:

重写onCreateContextMenu(ContextMenumenu,Viewv,ContextMenuInfomenuInfo)方法;

调用Activity的registerForContextMenu(Viewview)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。

创建菜单xml文件,必须以<menu>为根标签

menu.setHeaderTitle(String)设置窗口头的标题

menu.setHeaderIcon(R.drawable.face)设置窗口头的图标

为菜单项提供响应,重写onContextItemSelected(MenuItemitem)。

Activity.registerForContextMenu(需要显示ContextMenu的控件)

<3>PopupMenu在指定UI控件的下方或上方显示的弹出菜单

(1)PopupMenu(Contextcontext,Viewanchor):第二个参数是指弹出菜单显示的哪一个控件的下方或上方

(2)MenuInflater.inflate(intmenuResId,PopupMenu.getMenu())加载菜单资源到弹出菜单对象中

(3)setOnMenuItemClickListener()设置弹出菜单项的点击事件

(4)show()弹出菜单

(5)dismiss()关闭菜单

<4>解决菜单项不显示图标的问题



//enable为true时,菜单添加图标有效,enable为false时无效。
privatevoidsetIconEnable(Menumenu,booleanenable)
{
try
{
Class<?>clazz=Class.forName("com.android.internal.view.menu.MenuBuilder");
Methodm=clazz.getDeclaredMethod("setOptionalIconsVisible",boolean.class);
m.setAccessible(true);

//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
m.invoke(menu,enable);

}catch(Exceptione)
{
e.printStackTrace();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: