Android 在活动中使用 Menu
•前行必备——创建 menu
首先,新建一个项目,选择 Empty Activity 选项,并命名为 Test Menu;
这样 Android Studio 自动为我们新建 MainActivity.java 和 activity_main.xml 文件;
进入 Test Menu 项目,将模式结构换成 Project 模式;
然后找到 app/scr/main/ 下的 res 文件夹;
有两种方式可以创建一个 menu;
方法一
如果创建一个新的项目,在 res 文件夹下默认没有 menu 这个文件夹;
我们的首要任务是新建一个 menu 文件夹,右击 res->New->Directory;
创建好 menu 文件夹后,右击menu->New->Menu resource file;
文件名输入 main,点击 OK 完成创建;
方法二
右击res->New->Android Resource File;
来到如下所示界面;
文件名输入 main,Resource type 选择 Menu 选项,点击 OK,就能实现和方法一一样的效果;
•渐入佳境——了解Menu
我们可以使用 <menu>、<item>、<group> 三种XML元素定义 Menu,下面简单介绍一下它们:
<menu>是菜单项的容器
- <menu>元素必须是该文件的根节点,并且能够包含一个或多个<item>和<group>元素
<item>是菜单项,用于定义MenuItem,可以嵌套<menu>元素,以便创建子菜单
<group>是<item>元素的不可见容器(可选)
- 可以使用它对菜单项进行分组,使一组菜单项共享可用性和可见性等属性。
其中,<item>是我们主要需要关注的元素,它的常见属性如下:
android:id:菜单项(MenuItem)的唯一标识
android:icon:菜单项的图标(可选)
android:title:菜单项的标题(必选)
android:showAsAction:指定菜单项的显示方式
- 常用的有ifRoom、never、always、withText
- 多个属性值之间可以使用|隔开
•步入主题——使用Menu
声明
我从网上下载了四张图片,放置在了 mipmap-hdpi 文件夹下:
![]()
![]()
![]()
依次命名为 icon_one , icon_two , icon_three , icon_four;
在我们新建的 main 中添加如下代码;
main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto">
- <item android:id="@+id/option_normal_1"
- android:icon="@mipmap/icon_one"
- android:title="普通菜单1"
- app:showAsAction="ifRoom"/>
- <item android:id="@+id/option_normal_2"
- android:icon="@mipmap/icon_two"
- android:title="普通菜单2"
- app:showAsAction="always"/>
- <item android:id="@+id/option_normal_3"
- android:icon="@mipmap/icon_three"
- android:title="普通菜单3"
- app:showAsAction="withText|always"/>
- <item android:id="@+id/option_normal_4"
- android:title="普通菜单4"
- android:icon="@mipmap/icon_four"
- app:showAsAction="never"/>
- </menu>
可以看到,我们在XML文件中定义了四个普通的菜单项。
同时,每一个<item>都有一个独特的 app:showAsAction 属性。
我们需要知道,菜单栏中的菜单项会分为两个部分:
一部分可以直接在菜单栏中看见,我们可以称之为常驻菜单
另一部分会被集中收纳到溢出菜单中(就是菜单栏右侧的小点状图标)
一般情况下,常驻菜单项以图标形式显示(需要定义 android:icon 属性);
而溢出菜单项则以文字形式显示(通过 android:title 属性定义)。
showAsAction差异
app:showAsAction="always" :菜单项永远不会被收纳到溢出菜单中
- 因此在菜单项过多的情况下可能超出菜单栏的显示范围
app:showAsAction="ifRoom" :在空间足够时,菜单项会显示在菜单栏中,否则收纳入溢出菜单中。
app:showAsAction="withText" :无论菜单项是否定义了 android:icon 属性,都只会显示它的标题,而不会显示图标
- 使用这种方式的菜单项默认会被收纳入溢出菜单中
app:showAsAction="never" :菜单项永远只会出现在溢出菜单中
现在我们已经在 XML 文件中将 Menu 定义完毕了,接下来还需要在Java代码中进行加载;
MainActivity.java
- public class MainActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.main,menu);
- return true;
- }
- }
在该代码中重写了 onCreateOptionsMenu(Menu menu) 方法;
重写方法时可以使用 Ctrl+O 快捷键,然后检索 onCreateOptionsMenu:
在该方法中通过 getMenuInflater() 方法得到 MenuInflater 对象;
再调用它的 inflate() 方法就可以给当前活动创建菜单了;
inflate() 方法接受两个参数:
第一个参数用于指定我们通过哪一个资源文件来创建菜单
- 这里传入 R.menu.main
第二个参数用于指定我们的菜单项将添加到哪一个 Menu 对象中
- 这里直接使用 onCreateOptionsMenu() 方法传入的 menu 参数
然后给这个方法返回 true,表示允许创建的菜单显示出来,如果返回 false,创建的菜单将无法显示;
运行效果
为 Menu 设置点击事件
修改 MainActivity.java 中的代码;
- public class MainActivity extends AppCompatActivity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.main,menu);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()){
- case R.id.option_normal_1:
- return true;
- case R.id.option_normal_2:
- return true;
- case R.id.option_normal_3:
- return true;
- case R.id.option_normal_4:
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
- }
在 onOptionsItemSelected(MenuItem item) 方法中,我们实现了菜单项的点击监听。
可以看见,这里是通过 MenuItem 的 id 进行区分的,对应着XML文件中<item>的id属性。
每次处理完点击事件后,记得要返回true,对系统而言这次点击事情才算是真正结束了。
此外,在 default 分支下,推荐调用父类的默认实现,即 super.onOptionsItemSelected(item) ;
避免在多个 Activity 使用公有父类的情况下菜单项点击事件无法触发
•声明
有关 Menu 的其他用法,请参考【Android Menu用法全面讲解】;
Android 在活动中使用 Menu的更多相关文章
- Android——在活动中使用Menu
ADT在HelloWorldActivity中自动创建了一个onCreateOptionsMenu()方法.这个方法是用于在活动中创建菜单的,现在我们来仔细分析一下了.手机毕竟和电脑不同,它的屏幕空间 ...
- 在活动中使用Menu
1.在res下创建menu普通文件夹,在menu下创建名为main的Menu资源文件 2.在menu组件下创建item组件:资源id,title标题名称 3.覆盖活动中的onCreateOptions ...
- 在Android软按键中添加Menu键
在Android中,有时候没有硬件Menu.于是需要软件Menu.但是默认Google想让你用ActionBar上的Menu. 但是,有时候我们确实需要在在底部的软按键上加Menu.这里提供一种方法, ...
- Android:活动的简单使用
2.1 活动是什么 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件, 主要用于和用户进行交互.一个应用程序中可以包含零个或多个活动,但不包含任何活动的 应用程 ...
- 【Android】6.0 添加Menu菜单组件、Intent启动活动、显式Intent、隐式Intent
1.0 在helloworld项目基础上创建活动SecondActivity: 2.0 其中main.xml: <?xml version="1.0" encoding=&q ...
- Android studio 中R.menu的创建
对于Android开发中的menu没有声明的情况: 首先,将鼠标定位到红色的menu上面, 然后,Alt+enter组合键,建立文件menu, 然后将以下代码复制进去: <item androi ...
- Android Studio 之 在活动中使用 Toast
•简介 Toast 是 Android 系统提供的一种非常好的提醒方式: 在程序中可以使用它将一些短小的信息通知给用户: 这些信息会在一段时间内自动消失,并且不会占用任何屏幕空间 •Toast.mak ...
- 在Activity中使用Menu
1.右击res-->New-->Directory输入文件名menu,在此文件夹下新建main菜单文件:右击menu-->New-->Menu resource file 2. ...
- Android笔记——活动的生命周期
一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...
随机推荐
- 为什么 Koa 的官方文档那么丑呀?
为什么 Koa 的官方文档那么丑呀? koa.js https://koajs.com/ 代码高亮 # $ nvm install 7, node.js v7.x.x+ $ yarn add koa ...
- uniapp scroll-view
https://uniapp.dcloud.io/component/scroll-view <view class="flex1"> <scroll-view ...
- TCP编程详解
目录 数据包格式 建立连接(三次握手) 数据传输 断开连接(四次挥手) 基础 客户端流程 编码 TCP服务端流程 TCP服务端编码 参考文献 TCP把连接作为最基本的对象,每一条TCP连接都有两个端点 ...
- Linux 内核和 Windows 内核有什么区别?
Windows 和 Linux 可以说是我们比较常见的两款操作系统的. Windows 基本占领了电脑时代的市场,商业上取得了很大成就,但是它并不开源,所以要想接触源码得加入 Windows 的开发团 ...
- 从微信小程序到鸿蒙js开发【06】——swiper&animator&marquee
目录: 1.swiper轮播图 2.image-animator幻灯片 3.marquee跑马灯 4.nginx动静分离 1.swiper轮播图 微信小程序的swiper组件中只能放置swiper-i ...
- Java Reference核心原理分析
本文转载自Java Reference核心原理分析 导语 带着问题,看源码针对性会更强一点.印象会更深刻.并且效果也会更好.所以我先卖个关子,提两个问题(没准下次跳槽时就被问到). 我们可以用Byte ...
- 简单比较 @EnableEurekaClient 和 @EnableDiscoveryClient 两个注解
@EnableEurekaClient 和 @EnableDiscoveryClient 都是让eureka发现该服务并注册到eureka的注解 相同点: 它们都能让注册中心Eureka发现 , 并将 ...
- RabbitMQ(一)安装篇
1. RabbitMQ 的介绍➢ 什么是 MQ?MQ 全称为 Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.➢ 要解决什么样的问题?在项目中,将一些无需即时返回且耗 ...
- 大数据开发-Spark-Streaming处理数据到mysql
前面一篇讲到streamin读取kafka数据加工处理后写到kafka数据,大数据开发-Spark-开发Streaming处理数据 && 写入Kafka是针对比如推荐领域,实时标签等场 ...
- gRPC-go源码(2):ClientConn
摘要 在上一篇文章中,我们聊了聊gRPC是怎么管理一条从Client到Server的连接的. 我们聊到了gRPC拥有Resolver,用来解析地址:拥有Balancer,用来做负载均衡. 在这一篇文章 ...