Android的菜单栏Menu用法详解(超详细)

news/2024/11/21 16:07:12/

菜单栏Menu用法讲解

菜单是Android应用中非常重要且常见的组成部分。能够极大的节省我们页面的使用空间,提高页面的利用率。
安卓常用的菜单有三种:

  • OptionMenu:选项菜单,android中最常见的菜单,通过Menu键来调用
  • ContextMenu:上下文菜单,通过长按某个视图组件后出现的菜单,该组件需注册上下文菜单
  • SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮框, 子菜单不支持嵌套,即不能包括其他子菜单

定义菜单的方式

  • 一直接通过编写菜单XML文件,然后调用: getMenuInflater().inflate(R.menu.menu_main, menu);加载菜单
  • 通过代码动态添加,onCreateOptionsMenu的参数menu,调用add方法添加菜单,add(菜单项的组号,ID,排序号,标题),另外如果排序号是按添加顺序排序的话都填0即可!

我们一般使用XML去定义Menu,这样可以减少Java代码的代码臃肿,而且不用每次都用代码分配 id,只需修改XML文件即可修改菜单的内容,这样在一定程度上位程序提供的了更好的解耦, 低耦合,高内聚

我们可以使用<menu><item><group>三种XML元素定义Menu:

<menu>是菜单项的容器。<menu>元素必须是该文件的根节点,并且能够包含一个或多个<item><group>元素。
<item>是菜单项,用于定义MenuItem,可以嵌套<menu>元素,以便创建子菜单。
<group><item>元素的不可见容器(可选)。可以使用它对菜单项进行分组,使一组菜单项共享可用性和可见性等属性。

其中,<item>是我们主要的元素,它的常见属性如下:

android:id:菜单项(MenuItem)的唯一标识
android:icon:菜单项的图标(可选)
android:title:菜单项的标题(必选)
android:showAsAction:指定菜单项的显示方式。常用的有 ifRoomneveralwayswithText,多个属性值之间可以使用|隔开。

一、选项菜单(OptionMenu)

1. 常用的方法:

//调用OptionMenu,在这里完成菜单初始化和加载
public boolean onCreateOptionsMenu(Menu menu)
//菜单项被选中时触发,这里完成事件处理
public boolean onOptionsItemSelected(MenuItem item)//菜单关闭会调用该方法
public void onOptionsMenuClosed(Menu menu)
//选项菜单显示前会调用该方法, 可在这里进行菜单的调整(动态加载菜单列表)
public boolean onPrepareOptionsMenu(Menu menu)
//选项菜单打开以后会调用这个方法
public boolean onMenuOpened(int featureId, Menu menu)

2.实例

实现这个非常的简单。

在这里插入图片描述

实现:

项目结构

在这里插入图片描述

  1. 首先在res资源目录下创建menu文件夹,在创建一个
    Menu Resource File取名为menu_optionmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/menu1"android:title="创建群聊"android:icon="@drawable/groupchat"/><itemandroid:id="@+id/menu2"android:title="加好友/群"android:icon="@drawable/add"/><itemandroid:id="@+id/menu3"android:title="一起派对"android:icon="@drawable/party"/><itemandroid:id="@+id/menu4"android:title="扫一扫"android:icon="@drawable/scan"/><itemandroid:id="@+id/menu5"android:title="面对面快传"android:icon="@drawable/quick_pass"/><itemandroid:id="@+id/menu6"android:title="收付款"android:icon="@drawable/payment"/>
</menu>
  1. java代码
public class MainActivity extends AppCompatActivity {private TextView mTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView=findViewById(R.id.text);}//该方法用于创建显示Menu@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_optionmenu,menu);return true;}//在选项菜单打开以后会调用这个方法,设置menu图标显示(icon)@Overridepublic boolean onMenuOpened(int featureId, Menu menu) {if (menu != null) {if (menu.getClass().getSimpleName().equalsIgnoreCase("MenuBuilder")) {try {Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);method.setAccessible(true);method.invoke(menu, true);} catch (Exception e) {e.printStackTrace();}}}return super.onMenuOpened(featureId, menu);}//该方法对菜单的item进行监听@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {mTextView.setText(item.getTitle());switch (item.getItemId()) {case R.id.menu1:Toast.makeText(this, "点击了第" + 1 + "个", Toast.LENGTH_SHORT).show();break;case R.id.menu2:Toast.makeText(this, "点击了第" + 2 + "个", Toast.LENGTH_SHORT).show();break;case R.id.menu3:Toast.makeText(this, "点击了第" + 3 + "个", Toast.LENGTH_SHORT).show();break;case R.id.menu4:Toast.makeText(this, "点击了第" + 4 + "个", Toast.LENGTH_SHORT).show();break;case R.id.menu5:Toast.makeText(this, "点击了第" + 5 + "个", Toast.LENGTH_SHORT).show();break;}return super.onOptionsItemSelected(item);}
}

如果要是用java代码来创建我们的menu,只需要在onCreateOptionsMenu方法中用menu的add方法添加即可

 @Overridepublic boolean onCreateOptionsMenu(Menu menu) {//add的参数(菜单项的组号,ID,排序号,标题)menu.add(1,1,1,"创建群聊");menu.add(1,1,2,"加好友/群");menu.add(1,1,3,"一起派对");menu.add(1,1,4,"扫一扫");menu.add(1,1,5,"面对面快传");menu.add(1,1,6,"收付款");//getMenuInflater().inflate(R.menu.menu_mian,menu);return true;}

二、上下文菜单(ContextMenu)

1. 使用步骤:

  1. 重写onCreateContextMenu()方法
  2. 为view组件注册上下文菜单,使用registerForContextMenu()方法,参数是View
  3. 重写onContextItemSelected()方法为菜单项指定事件监听器

2. 实例

在这里插入图片描述

实现:
  1. 在menu文件下新建一个menu_context.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><!-- 定义一组单选按钮 --><!-- checkableBehavior的可选值由三个:single设置为单选,all为多选,none为普通选项 --><group android:checkableBehavior="none"><item android:id="@+id/blue" android:title="蓝色"/><item android:id="@+id/green" android:title="绿色"/><item android:id="@+id/red" android:title="红色"/><item android:id="@+id/yellow" android:title="黄色"/></group>
</menu>
  1. java代码
public class MainActivity extends AppCompatActivity {private TextView mTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView=findViewById(R.id.text);registerForContextMenu(mTextView);//注册上下文菜单}//重写上下文菜单的创建方法@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {MenuInflater inflator = new MenuInflater(this);inflator.inflate(R.menu.menu_context, menu);super.onCreateContextMenu(menu, v, menuInfo);}//上下文菜单的点击事件@Overridepublic boolean onContextItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {case R.id.blue:mTextView.setTextColor(Color.BLUE);break;case R.id.green:mTextView.setTextColor(Color.GREEN);break;case R.id.red:mTextView.setTextColor(Color.RED);break;case R.id.yellow:mTextView.setTextColor(Color.YELLOW);break;}return super.onContextItemSelected(item);}
}

三、子菜单(SubMenu)

子菜单就是在<item>中又嵌套了一层<menu>,也可以再嵌套一层。

1. 实例:

在这里插入图片描述

  1. 在menu文件下新建menu_sub.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+id/colour" android:title="变颜色~"><menu><group android:checkableBehavior = "none"><item android:id="@+id/colour_blue" android:title="蓝色"/><item android:id="@+id/colour_green" android:title="绿色"/><item android:id="@+id/colour_red" android:title="红色"/><item android:id="@+id/colour_yellow" android:title="黄色"/></group></menu></item><item android:id="@+id/font_size" android:title="变字体大小~"><menu><group android:checkableBehavior = "none"><item android:id="@+id/font_size_10sp" android:title = "10sp"/><item android:id="@+id/font_size_30sp" android:title = "30sp"/><item android:id="@+id/font_size_50sp" android:title = "50sp"/><item android:id="@+id/font_size_70sp" android:title = "70sp"/></group></menu></item><item android:id="@+id/text" android:title="变文字~"><menu><group android:checkableBehavior = "none"><item android:id="@+id/text_hello" android:title = "你好"/><item android:id="@+id/text_menu" android:title = "菜单"/><item android:id="@+id/text_MQ" android:title = "毛小钱"/><item android:id="@+id/text_div" android:title = "自定义"/></group></menu></item>
</menu>
  1. java代码
public class MainActivity extends AppCompatActivity {private TextView mTextView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView=findViewById(R.id.text);registerForContextMenu(mTextView);//注册上下文菜单}//重写上下文菜单的创建方法@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {MenuInflater inflator = new MenuInflater(this);inflator.inflate(R.menu.menu_sub, menu);super.onCreateContextMenu(menu, v, menuInfo);}//上下文菜单的点击事件@Overridepublic boolean onContextItemSelected(@NonNull MenuItem item) {switch (item.getItemId()) {case R.id.colour_blue:mTextView.setTextColor(Color.BLUE);break;case R.id.colour_green:mTextView.setTextColor(Color.GREEN);break;case R.id.colour_red:mTextView.setTextColor(Color.RED);break;case R.id.colour_yellow:mTextView.setTextColor(Color.YELLOW);break;case R.id.font_size_10sp:mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,10);break;case R.id.font_size_30sp:mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,30);break;case R.id.font_size_50sp:mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,50);break;case R.id.font_size_70sp:mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP,70);break;case R.id.text_hello:case R.id.text_menu:case R.id.text_MQ:mTextView.setText(item.getTitle());break;case R.id.text_div:final EditText editText = new EditText(this);AlertDialog dialog = new AlertDialog.Builder(this).setTitle("请输入要自定义的文字").setView(editText).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {mTextView.setText(editText.getText().toString());}}).setNegativeButton("取消",null).show();break;}return super.onContextItemSelected(item);}
}

关于Menu的使用就了解到这里了。


http://www.ppmy.cn/news/146139.html

相关文章

实体键和虚拟键不同的menu显示方式

这是一篇我个人在EOE发的blog《实体键和虚拟键不同的menu显示方式》&#xff0c;由于eoe的blog系统实在是无言以对&#xff0c;我就把eoe上面的帖子以及blog是都转到csdn上来&#xff0c;原帖&#xff1a;http://www.eoeandroid.com/blog-781265-49717.html 虚拟键盘的menu键盘…

Android 如何监听返回键,弹出一个退出对话框

Android 如何监听返回键点击事件&#xff0c;并创建一个退出对话框&#xff0c; 防止自己写的应用程序不小心点击退出键而直接退出。自己记录下这个简单的demo,备用。 注&#xff1a;如下代码当时是从网上copy过来的&#xff0c;现在忘了它出自哪个原作者了&#xff0c;在此说声…

C# 中有四种定时器

目录 C# / .Net中的四种定时器&#xff1a; 1、System.Threading.Timer 2&#xff1a;System.Timers.Timer 3&#xff1a;System.Windows.Forms.Timer&#xff08;Windows Forms Timer&#xff09; 4&#xff1a;System.Windows.Threading.DispatcherTimer(WPF timer); C#…

Tomcat配置debug日志

感觉这个不是很难&#xff0c;但是又没有找到合适的&#xff0c;重新写一条吧。要在Tomcat中设置调试&#xff08;debug&#xff09;日志&#xff0c;您可以按照以下步骤进行操作&#xff1a; 导航到Tomcat安装目录下的conf文件夹。 在conf文件夹中找到logging.properties文件…

Vue3 小兔鲜4:Layout-静态模版结构搭建

Vue3 小兔鲜4&#xff1a;Layout-静态模版结构搭建 Date: May 31, 2023 目标效果&#xff1a; 分成Nav、Heade、二级路由出口、Footer区域 组件结构快速搭建 Nav <script setup></script><template><nav class"app-topnav"><div clas…

企业开发前端框架2023最新前沿技术vue3+vite+vuetify+js+Tailwind Css

文章目录 前言创建项目1、打开vuetify的官网下载项目2、下载依赖3、添加tailwindcss依赖 结束 前言 最近需要开发新的项目&#xff0c;正好学习了Tailwindcss&#xff0c;所以就想着集成到新项目里来&#xff0c;一来可以精进项目经验&#xff0c;也可以感受一下tailwindcss的…

RocksDB笔记 -- 整体架构

RocksDB是由Facebook开发的存储引擎, 它最初的目标是用于快速存储, 特别是Flash存储. 一个基于C开发keys-values存储引擎库. 整体架构 RocksDB由这三个基本结构组成: memtable, sstfile 和 logfile. 其中: memtable是一个内存数据结构, 新的写入会插入到memtable中, 同时可选…

bing必应壁纸下载器

自己写的一个简单的必应壁纸获取工具&#xff0c;可以自动获取必应壁纸并设置为桌面。 界面如图 下载地址 https://wjk.lanzous.com/ibf8xyb