Android三种菜单(Menu)的实现
⼀、常⽤⽅法
javaonCreateOptionsMenu(Menumenu)
每次Activity⼀创建就会执⾏,⼀般只执⾏⼀次,创建并保留Menu的实例;
//获取MenuInflater
MenuInflaterinflater=getMenuInflater();
//加载Menu资源
e(_menu_normal,menu);
//此⽅法必须返回true,否则不予显⽰
returntrue;
javaonPrepareOptionsMenu(Menumenu)
每次menu被打开时,该⽅法就会执⾏⼀次,可⽤于对传⼊的旧Menu对象进⾏修改操作;
javaonOptionsItemSelected(MenuItemitem)
每次menu菜单项被点击时,该⽅法就会执⾏⼀次;
@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(mId()){
_normal_1:
returntrue;//返回true,将结束点击事件,不会进⼊下⼀级菜单
_normal_2:
returntrue;
_normal_3:
returntrue;
_normal_4:
returntrue;
default:
onsItemSelected(item);//不返回true,避免截断菜单项的点击事件
}
}
javainvalidateOptionsMenu()
刷新menu⾥的选项⾥内容,它会调⽤onCreateOptionsMenu(Menumenu)⽅法
javaonCreateContextMenu()
创建控件绑定的上下⽂菜单menu,根据⽅法⾥的View参数识别是哪个控件绑定
javaonContextItemSelected(MenuItemitem)
点击控件绑定的上下菜单menu的内容项
javainvalidateOptionsMenu()
通知系统刷新Menu,之后,onPrepareOptionsMenu会被调⽤
⼆、使⽤XML定义Menu
理论上⽽⾔,使⽤XML和Java代码都可以创建Menu。但是在实际开发中,往往通过XML⽂件定义Menu,这样做有以下⼏个好处:
使⽤XML可以获得更清晰的菜单结构
将菜单内容与应⽤的逻辑代码分离
可以使⽤应⽤资源框架,为不同的平台版本、屏幕尺⼨创建最合适的菜单(如对drawable、string等系统资源的使⽤)
要定义Menu,我们⾸先需要在res⽂件夹下新建menu⽂件夹,它将⽤于存储与Menu相关的所有XML⽂件。
我们可以使⽤
、、三种XML元素定义Menu,下⾯简单介绍⼀下它们:
是菜单项的容器。
元素必须是该⽂件的根节点,并且能够包含⼀个或多个和元素。
是菜单项
⽤于定义MenuItem,可以嵌套元素,以便创建⼦菜单。
是元素的不可见容器(可选)。
可以使⽤它对菜单项进⾏分组,使⼀组菜单项共享可⽤性和可见性等属性。
其中,是我们主要需要关注的元素,它的常见属性如下:
android:id:菜单项(MenuItem)的唯⼀标识
android:icon:菜单项的图标(可选)
android:title:菜单项的标题(必选)
android:showAsAction:指定菜单项的显⽰⽅式。常⽤的有ifRoom、never、always、withText,多个属性值之间可以使⽤|隔开
名称效果
在碎⽚中调⽤菜单时,要在Fragment的onCreate()⽅法中调⽤tHasOptionsMenu(true)
⽅法使之显⽰出来。
三、三种菜单类型
1、选项菜单
选项菜单是⼀个应⽤的主菜单项,⽤于放置对应⽤产⽣全局影响的操作,如搜索/设置
包含多级⼦项的XML代码,通过onOptionsItemSelected(MenuItemitem)返回值为true来截断
//包含多级⼦项的XML代码
xmlns:app="/apk/res-auto">
android:title="⽂件"
app:showAsAction="ifRoom">
android:title="新建"/>
android:title="保存"/>
android:title="更多">
android:title="更多1"/>
android:title="更多2"/>
android:title="更多更多">
android:title="更多更多1"/>
android:title="更多更多2"/>
//Java代码
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
MenuInflaterinflater=getMenuInflater();
e(_menu_normal,menu);
returntrue;
}
@Override
publicbooleanonOptionsItemSelected(MenuItemitem){
switch(mId()){
_normal_1:
returntrue;
_normal_2:
returntrue;
_normal_3:
returntrue;
_normal_4:
returntrue;
default:
onsItemSelected(item);
}
}
2、上下⽂菜单
上下⽂菜单是⽤户长按某⼀元素时出现的浮动菜单。它提供的操作将影响所选内容,主要应⽤于列表中的每⼀项元素(如长按列表项弹出删除对话框)。上下⽂操作模式将在屏幕
顶部栏(菜单栏)显⽰影响所选内容的操作选项,并允许⽤户选择多项,⼀般⽤于对列表类型的数据进⾏批量操作。
要提供浮动上下⽂菜单,可以参照以下步骤:
在Activity或Fragment中调⽤registerForContextMenu(Viewv)
⽅法,注册需要和上下⽂菜单关联的View。如果将ListView或GridView作为参数传⼊,那么每个列表项将会有相同的浮动上下⽂菜单。
always菜单项永远不会被收纳到溢出菜单中,因此在菜单项过多的情况下可能超出菜单栏的显⽰范围。
ifRoom在空间⾜够时,菜单项会显⽰在菜单栏中,否则收纳⼊溢出菜单中。
withText⽆论菜单项是否定义了icon属性,都只会显⽰它的标题,⽽不会显⽰图标。使⽤这种⽅式的菜单项默认会被收纳⼊溢出菜单中。
never菜单项永远只会出现在溢出菜单中。
在Activity或Fragment中重写onCreateContextMenu⽅法,加载Menu资源。
在Activity或Fragment中重写onContextItemSelected⽅法,实现菜单项的点击逻辑。
3、弹出菜单(不需要onCreateOptionsMenu⽅法)
弹出菜单以垂直列表形式显⽰⼀系列操作选项,⼀般由某⼀控件触发,弹出菜单将显⽰在对应控件的上⽅或下⽅。它适⽤于提供与特定内容相关的⼤量操作。
可以将弹出菜单的使⽤拆分为以下四个步骤:
实例化PopupMenu,它的构造⽅法需要两个参数,分别为Context以及PopupMenu依赖的View对象。
使⽤MenuInflater将Menu资源加载到u()返回的Menu对象中。
调⽤tOnMenuItemClickListener⽅法为PopupMenu设置点击监听器。
调⽤()将弹出菜单显⽰出来。
//XML⽂件代码
android:title="添加"/>
android:title="删除"/>
android:title="更多"/>
//Java⽂件代码
@Override
protectedvoidonCreate(BundlesavedInstanceState){
te(savedInstanceState);
tContentView(ty_popup_menu);
findViewById(_menu_view).tOnClickListener(kListener(){
@Override
publicvoidonClick(Viewview){
PopupMenupopupMenu=newPopupMenu(,view);//1.实例化PopupMenu
getMenuInflater().inflate(_menu,u());//2.加载Menu资源
//3.为弹出菜单设置点击监听
enuItemClickListener(ItemClickListener(){
@Override
publicbooleanonMenuItemClick(MenuItemitem){
switch(mId()){
_add:
xt(,"添加",_SHORT).show();
returntrue;
_delete:
xt(,"删除",_SHORT).show();
returntrue;
_more:
xt(,"更多",_SHORT).show();
returntrue;
default:
returnfal;
}
}
});
();//4.显⽰弹出菜单
}
});
}
本文发布于:2023-03-15 19:56:15,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678881376266997.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:菜单栏.doc
本文 PDF 下载地址:菜单栏.pdf
留言与评论(共有 0 条评论) |