Menu菜单资源
android应用推荐使用XML来定义菜单,其可提供更好的解耦方式。
菜单资源通常位于res/menu文件夹下,其菜单根元素为<menu.../>,menu元素下可包含子元素如下:
<item.../>子元素 | 定义菜单项 |
<group.../>子元素 | 将多个<item>定义的菜单项包装成一个菜单组 |
<group.../>子元素 |
用于控制整个菜单组的行为,该元素可指定如下常用属性: |
checkableBehavior:指定该组菜单的行为,可指定为none(不可选)、all(多选)、single(单选) menuCategory:对菜单进行分类,指定菜单的优先级。有效值为container、system、secondary、alternative visible:指定改组菜单是否可见 enable:指定改组菜单是否可用 |
<item.../>元素用于定义一份菜单项,其又可包含<menu.../>元素,位于<item.../>内的<menu../>代表子菜单。
<item.../>元素可指定如下属性:
android:id | 为菜单项指定唯一标识 |
android:title | 指定菜单项标题 |
android:icon | 指定菜单项图标 |
android:alphabeticShortcut | 为菜单项指定字符快捷键 |
android:numericShortcut | 为菜单项指定数字快捷键 |
android:checkable | 设置菜单项是否可选 |
android:checked | 设置菜单项是否已选中 |
android:visible | 设置菜单项是否可见 |
android:enable | 设置菜单项是否可用 |
注意:一旦在程序中定义菜单资源后,需要重写onCreateOptionsMenu(用于创建选项菜单)、onCreateContextMenu(用于创建上下文菜单),
在这些方法调用MenuInflater对象的inflate方法装载指定资源对应的菜单即可。
实例如下:
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 | 资源文件==》mymenu.xml <?xml version= "1.0" encoding= "utf-8" ?> <menu xmlns:android= "http://schemas.android.com/apk/res/android" > <item android:icon= "@drawable/font" android:title= "@string/font_size" > <menu> <!-- 定义一组单选菜单项 --> < group android:checkableBehavior= "single" > <!-- 定义多个菜单项 --> <item android:id= "@+id/font_10" android:title= "@string/font_10" > </item> <item android:id= "@+id/font_12" android:title= "@string/font_12" > </item> </ group > </menu> </item> <!-- 定义一个普通菜单 --> <item android:id= "@+id/plain_item" android:title= "@string/plant_item" /> <item android:icon= "@drawable/color" android:title= "@string/font_color" > <menu> <!-- 定义一组运行复选的菜单项 --> < group > <item android:id= "@+id/red_font" android:title= "@string/font_red" /> <item android:id= "@+id/green_font" android:title= "@string/font_green" /> <item android:id= "@+id/blue_font" android:title= "@string/font_blue" /> </ group > </menu> </item> </menu> context.xml==》 <?xml version= "1.0" encoding= "utf-8" ?> <menu xmlns:android= "http://schemas.android.com/apk/res/android" > <!-- 定义一组单选菜单 --> < group android:checkableBehavior= "single" > <item android:id= "@+id/red1" android:title= "@string/title_red" android:alphabeticShortcut= "r" /> <item android:id= "@+id/green1" android:title= "@string/title_green" android:alphabeticShortcut= "g" /> <item android:id= "@+id/blue1" android:title= "@string/title_blue" android:alphabeticShortcut= "b" /> </ group > </menu> 布局文件==> <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/tvtest" android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:text= "110112119" /> </LinearLayout> |
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 | 代码实现==》 package com.example.mymenu2; import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private EditText tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i( "swg" , "aaaaaaaaaaaaaaaaaa" ); tv = (EditText) this .findViewById(R.id.tvtest); // 为文本框注册上下文菜单 registerForContextMenu(tv); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = new MenuInflater( this ); inflater.inflate(R.menu.context, menu); return super.onCreateOptionsMenu(menu); } @Override // 每次创建上下文菜单时都会触发该方法 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { MenuInflater inflater = new MenuInflater( this ); inflater.inflate(R.menu.mymenu, menu); menu.setHeaderIcon(R.drawable.oneowne); menu.setHeaderTitle( "请选择背景色" ); } @Override // 上下文菜单中菜单项被单击时触发该方法 public boolean onOptionsItemSelected(MenuItem item) { Log.i( "swg" , "111111111111111111111" ); Log.i( "swg" , "item.getItemId()====" + item.getItemId()); switch (item.getItemId()) { case R.id.red1: // case R.id.red_font: item.setChecked( true ); tv.setBackgroundColor(Color.RED); tv.setTextColor(Color.RED); System. out .println( "-------------------RED------------------" ); Log.i( "swg" , "aaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrr" ); break ; case R.id.green1: item.setChecked( true ); tv.setBackgroundColor(Color.GREEN); tv.setTextColor(Color.GREEN); System. out .println( "-------------------GREEN------------------" ); Log.i( "swg" , "aaaaaaaaaaaaaaaaaaddddddddddddddddd" ); break ; case R.id.blue1: item.setChecked( true ); tv.setBackgroundColor(Color.BLUE); tv.setTextColor(Color.BLUE); System. out .println( "-------------------BLUE------------------" ); Log.i( "swg" , "aaaaaaaaaaaaaaaaaabbbbbbbbbb" ); break ; } return true ; } // 菜单项被单击后的回调方法 @Override public boolean onContextItemSelected(MenuItem item) { Log.i( "swg" , "2222222222222222" ); switch (item.getItemId()) { case R.id.font_10: tv.setTextSize(10 * 2); break ; case R.id.font_12: tv.setTextSize(12 * 2); break ; case R.id.plain_item: Toast.makeText(MainActivity. this , "你单击了普通菜单" , Toast.LENGTH_LONG).show(); break ; } return true ; } } |
注意:长按可触发上下文方法;普通菜单需要处理onCreateOptionsMenu、onOptionsItemSelected;上下文菜单需要处理onCreateContextMenu、onContextItemSelected
运行效果:略。
【推荐】国内首个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搭建本