菜单在桌面应用程序中使用非常广泛,由于手机屏幕的制约,菜单在手机应用中减少不少。
android应用中的菜单默认是不可见的,只有当用户单击手机上“Menu”键时,系统才会显示该应用关联的采用项。
android应用同样支持上下文菜单(ContentMenu),用户一直按住某个应用的界面时,该应用所关联上下文菜单就会显示出来。
选项菜单和子菜单SubMenu
注意:android系统默认做到只有6个菜单位,超过6个菜单,系统将会在第6个菜单位显示“更多”。
android系统的菜单支持主要通过4个接口来提现:
Menu、SubMenu、ContextMenu、MeunItem
==>SubMenu:代表一个普通菜单,可以包含N个MenuItem(N>=1);
ContextMenu:代表一个子菜单,可以包含N个MeunItem;
Menu定义了如下方法添加菜单或菜单项:
MenuItem add(int titileRes):添加一个新的菜单项;
MenuItem add(int groupId,int itemId,int order,CharSequence title):添加一个新的处于groupId组的菜单项;
MenuItem add(int groupId,int itemId,int order,int titleRes):添加一个新的处于groupId组的菜单项;
MenuItem add(CharSequence title):添加一个新的菜单项;
SubMenu addSubMenu(int titleRes):添加一个新的菜单项;
SubMenu addSubMenu(int groupId,int itemId,int order,int titleRes):添加一个新的处于groupId组的子菜单;
SubMenu addSubMenu(CharSequence title):添加一个新的子菜单;
SubMenu addSubMenu(int groupId,int itemId,int order,CharSequence title):添加一个新的处于groupId组的子菜单;
注意:add()用于添加菜单,addSubMenu()用于添加子菜单;这些方法的重载区别只是:是否将子菜单、菜单项添加到指定菜单中,是否使用资源文件中的字符串资源来设置标题。
SubMenu继承了Menu,其代表了一个子菜单项,额外提供了如下常用方法:
SubMenu setHeaderIcon(Drawable icon) | 设置菜单的图标 |
SubMenu setHeaderIcon(int iconRes) | 设置菜单的图标 |
SubMenu setHeaderTitle(int titleRes) | 设置菜单的标题 |
SubMenu setHeaderTitle(CharSequence title) | 设置菜单的标题 |
SubMenu setHeaderView(View view) | 使用View来设置菜单头 |
添加菜单/菜单项的操作步骤:
1.重写Activity的onCreateOptionsMenu(Menu menu),在该方法里调用Menu对象的方法来添加菜单项或子菜单;
2.如果希望程序能响应菜单项的单击事件,重写Activity的onOptionsItemSelected(MenuItem item)方法即可;
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | 布局文件==》 <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" tools:context= ".MainActivity" > <EditText android:id= "@+id/edit" android:layout_width= "match_parent" android:layout_height= "wrap_content" /> </LinearLayout> 代码实现==》 package com.example.mymenu; import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { // 定义字体大小菜单项的标识 final int font_10 = 0x111; final int font_12 = 0x112; final int font_14 = 0x113; final int font_16 = 0x114; final int font_18 = 0x115; // 定义普通菜单的标识 final int plain_item = 0x11b; // 定义字体颜色菜单项的标识 final int font_red = 0x116; final int font_blue = 0x117; final int font_green = 0x118; EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit = (EditText) this .findViewById(R.id.edit); } @Override public boolean onCreateOptionsMenu(Menu menu) { SubMenu fontMeun = menu.addSubMenu( "字体大小" ); // 设置菜单图标 fontMeun.setIcon(R.drawable.eighteen); // 设置菜单头图标 fontMeun.setHeaderIcon(R.drawable.eighteen); // 设置菜单的标题 fontMeun.setHeaderTitle( "请选择字体大小" ); fontMeun.add(0, font_10, 0, "10" ); fontMeun.add(0, font_12, 0, "12" ); fontMeun.add(0, font_14, 0, "14" ); fontMeun.add(0, font_16, 0, "16" ); fontMeun.add(0, font_18, 0, "18" ); // 向Menu添加菜单项 menu.add(0, plain_item, 0, "普通菜单项" ); SubMenu colorMenu = menu.addSubMenu( "字体颜色" ); // 设置菜单图标 colorMenu.setIcon(R.drawable.three); // 设置菜单头图标 colorMenu.setHeaderIcon(R.drawable.three); // 设置菜单的标题 colorMenu.setHeaderTitle( "请选择字体颜色" ); colorMenu.add(0, font_red, 0, "红色" ); colorMenu.add(0, font_blue, 0, "蓝色" ); colorMenu.add(0, font_green, 0, "绿色" ); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case font_10: edit.setTextSize(10 * 2); break ; case font_12: edit.setTextSize(12 * 2); break ; case font_14: edit.setTextSize(14 * 2); break ; case font_16: edit.setTextSize(16 * 2); break ; case font_18: edit.setTextSize(18 * 2); break ; case font_red: edit.setTextColor(Color.RED); break ; case font_blue: edit.setTextColor(Color.BLUE); break ; case font_green: edit.setTextColor(Color.GREEN); break ; case plain_item: Toast.makeText(MainActivity. this , "单击了普通菜单项" , Toast.LENGTH_LONG).show(); break ; } return true ; } } |
注意:程序中需要在onOptionsItemSelected(MenuItem item)中判断那个菜单项被选择了,因此在添加菜单时,需要为每个菜单添加ID.
运行效果:
使用监听器监听菜单事件
除了重写onOptionsItemSelected(MenuItem item)可以响应菜单项被选择,同时支持通过为菜单项添加setOnMenuItemClickListener监听器监听菜单事件。
通过事件的处理方式,无须为每个菜单项添加ID.
使用方式如下图:
....
注意:建议采用重写onOptionsItemSelected(MenuItem item)方式实现菜单的事件处理.
创建复现菜单项和单选菜单项
如果需要创建的菜单项是单选菜单项或多选菜单项,则可调用MenuItem如下方法:
setCheckable(boolean checkable) | 设置菜单项是否可以被勾选,调用该方法后的菜单项默认是多选菜单项 |
segGroupCheckable(int group,boolean checkable,boolean exclusive) | 如果希望一组菜单项里的菜单项都设为可勾选的菜单项,则调用该方法;——设置group组里的所有菜单项是否可勾选,如果将exclusive设为true,那么其将是一组单选菜单项; |
setAlphabeticShortcut(char aplhaChar) | 设置字母快捷键 |
setNumericShortcut(char numericChar) | 设置数字快捷键 |
setShortcut(char numericChar,char aplhaChar) | 同时设置字母和数组快捷键 |
注意:
可勾选菜单的菜单必须由程序代码控制
实例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 布局文件==》 <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" tools:context= ".MainActivity" > <EditText android:id= "@+id/edit" android:layout_width= "match_parent" android:layout_height= "wrap_content" /> </LinearLayout> 代码实现==》 package com.example.mycheckmenu; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.MenuItem; import android.view.SubMenu; import android.widget.EditText; public class MainActivity extends Activity { final int MALE = 0x111; final int FEMALE = 0x112; final int RED = 0x113; final int GREEN = 0x114; final int BLUE = 0x115; MenuItem[] Items = new MenuItem[3]; String[] ColorsName = new String[] { "红色" , "绿色" , "蓝色" }; EditText edit; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edit = (EditText) this .findViewById(R.id.edit); } @Override public boolean onCreateOptionsMenu(Menu menu) { SubMenu m = menu.addSubMenu( "性别:" ); // 设置菜单图片 m.setIcon(R.drawable.eight); // 设置菜单头的图标 m.setHeaderIcon(R.drawable.eight); m.setHeaderTitle( "请选择性别" ); m.addSubMenu(0, MALE, 0, "男" ); m.addSubMenu(0, FEMALE, 0, "女" ); // 设置m菜单内0组菜单项为单选菜单项 m.setGroupCheckable(0, true , true ); // 向m菜单中添加子菜单 SubMenu sub = m.addSubMenu( "颜色" ); sub.setIcon(R.drawable.sl); // 设置菜单头的图标 sub.setHeaderIcon(R.drawable.sl); sub.setHeaderTitle( "请选择颜色" ); // 添加菜单项,并设置为可勾选的菜单项 Items[0] = sub.add(0, RED, 0, ColorsName[0]).setCheckable( true ); Items[1] = sub.add(0, GREEN, 0, ColorsName[1]).setCheckable( true ); Items[2] = sub.add(0, BLUE, 0, ColorsName[2]).setCheckable( true ); // 设置快捷键 Items[2].setAlphabeticShortcut( 'A' ); return super.onCreateOptionsMenu(menu); } // 菜单项被单击后回调方法 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MALE: edit.setText( "选择了性别为:男" ); item.setChecked( true ); // 必须通过代码更改勾选状态 break ; case FEMALE: edit.setText( "选择了性别为:女" ); item.setChecked( true ); // 必须通过代码更改勾选状态 break ; case RED: case GREEN: case BLUE: setColor(item); break ; } return super.onOptionsItemSelected(item); } private void setColor(MenuItem item) { if (item.isChecked()) { item.setChecked( false ); } else { item.setChecked( true ); } StringBuffer buf = new StringBuffer(); buf.append( "选择的颜色有:" ); for ( int i = 0; i < Items.length; i++) { if (Items[i].isChecked()) { buf.append(ColorsName[i]); buf.append( "、" ); } } edit.setText(buf); } } |
运行效果:
设置与菜单项关联的Activity
设置与菜单项关联的Activity——即,应用程序单击某个菜单项时启动Activity。
对于此种需求,只需要处理MenuItem的setIntent(Intent intent)方法即可——该方法把该菜单项与指定的intent关联到一起,当用户单击该菜单项时,该Intent所代表的组件将会被启动。
实例:
注意:新添加的Activity,需要在AndroidMainfext.xml添加定义。
上下文菜单
android用ContextMeun来代表上下文菜单,为android应用开发上下文菜单与开发选项菜单的方法基本相似,ContextMenu继承Menu,因此程序可使用相同的方法为其添加菜单项。
开发上下文菜单与开发选项菜单的区别:
上下文菜单不是重写onCreateOptionsMenu(Menu menu)方法,而是重写onCreateContextMenu(ContextMenu menu,View view,ContextMenu.ContextMenuInfo menuInfo)方法——其中view参数代表触发上下文菜单的组件。
开发上下文菜单的步骤如下:
1.重写Activity的onCreateContextMenu(ContextMenu menu,View view,ContextMenu.ContextMenuInfo menuInfo)方法;
2.调用Activity的registerForContextMenu(View view)方法为组件注册上下文菜单;
3.如果希望程序可以为菜单提供响应,可重写onContextItemSelected(MenuItem mi)方法,或为指定菜单绑定事件监听器;
ContextMenu常用方法如下:
ContextMenu setHeaderIcon(Drawable icon) | 为上下文菜单设置图标 |
ContextMenu setHeaderIcon(int iconRes) | 为上下文菜单设置图标 |
ContextMenu setHeaderTitle(int titleRes) | 为上下文菜单设置标题 |
注意:android中提供了两种创建菜单的方式,一种是通过java代码创建,一种是使用XML资源文件定义。
一般建议使用XML资源文件定义方式创建菜单。
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | 布局文件==》 <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" xmlns:tools= "http://schemas.android.com/tools" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" tools:context= ".MainActivity" > <TextView android:id= "@+id/tvContent" android:layout_width= "match_parent" android:layout_height= "wrap_content" android:text= "110110110110" /> </LinearLayout> 代码实现==》 package com.example.mycontextmenu; import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { final int Menu1 = 0x111; final int Menu2 = 0x112; final int Menu3 = 0x113; TextView TvContent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TvContent = (TextView) this .findViewById(R.id.tvContent); // 为文本框注册上下文菜单 registerForContextMenu(TvContent); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.addSubMenu(0, Menu1, 0, "红色" ); menu.addSubMenu(0, Menu2, 0, "绿色" ); menu.addSubMenu(0, Menu3, 0, "蓝色" ); // 设置菜单头的图标 menu.setGroupCheckable(0, true , true ); menu.setHeaderIcon(R.drawable.three); menu.setHeaderTitle( "请选择颜色" ); super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case Menu1: item.setChecked( true ); TvContent.setBackgroundColor(Color.RED); break ; case Menu2: item.setChecked( true ); TvContent.setBackgroundColor(Color.GREEN); break ; case Menu3: item.setChecked( true ); TvContent.setBackgroundColor(Color.BLUE); break ; } return super.onContextItemSelected(item); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true ; } } |
运行效果:
长按“110110110110”
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本