•前行必备——创建 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的更多相关文章

  1. Android——在活动中使用Menu

    ADT在HelloWorldActivity中自动创建了一个onCreateOptionsMenu()方法.这个方法是用于在活动中创建菜单的,现在我们来仔细分析一下了.手机毕竟和电脑不同,它的屏幕空间 ...

  2. 在活动中使用Menu

    1.在res下创建menu普通文件夹,在menu下创建名为main的Menu资源文件 2.在menu组件下创建item组件:资源id,title标题名称 3.覆盖活动中的onCreateOptions ...

  3. 在Android软按键中添加Menu键

    在Android中,有时候没有硬件Menu.于是需要软件Menu.但是默认Google想让你用ActionBar上的Menu. 但是,有时候我们确实需要在在底部的软按键上加Menu.这里提供一种方法, ...

  4. Android:活动的简单使用

    2.1    活动是什么 活动(Activity)是最容易吸引到用户的地方了,它是一种可以包含用户界面的组件, 主要用于和用户进行交互.一个应用程序中可以包含零个或多个活动,但不包含任何活动的 应用程 ...

  5. 【Android】6.0 添加Menu菜单组件、Intent启动活动、显式Intent、隐式Intent

    1.0 在helloworld项目基础上创建活动SecondActivity: 2.0 其中main.xml: <?xml version="1.0" encoding=&q ...

  6. Android studio 中R.menu的创建

    对于Android开发中的menu没有声明的情况: 首先,将鼠标定位到红色的menu上面, 然后,Alt+enter组合键,建立文件menu, 然后将以下代码复制进去: <item androi ...

  7. Android Studio 之 在活动中使用 Toast

    •简介 Toast 是 Android 系统提供的一种非常好的提醒方式: 在程序中可以使用它将一些短小的信息通知给用户: 这些信息会在一段时间内自动消失,并且不会占用任何屏幕空间 •Toast.mak ...

  8. 在Activity中使用Menu

    1.右击res-->New-->Directory输入文件名menu,在此文件夹下新建main菜单文件:右击menu-->New-->Menu resource file 2. ...

  9. Android笔记——活动的生命周期

    一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...

随机推荐

  1. GitHub new features 2020 All In One

    GitHub new features 2020 All In One Discussions Discussions is the space for your community to have ...

  2. how to input special symbol in macOS

    how to input special symbol in macOS 如何在 macOS 中输入特殊符号 1024 ≈ 1000 2^10 == 1024 约等于 1000, 方便用来表示 Opt ...

  3. Flutter Search Component

    Flutter Search Component flutter 搜索组件 xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  4. 微软 AI 公开课

    微软 AI 公开课 https://github.com/microsoft/ai-edu https://school.azure.cn/ https://docs.microsoft.com/le ...

  5. js & sort array object

    js & sort array object sort array object in js https://flaviocopes.com/how-to-sort-array-of-obje ...

  6. Nestjs 上传文件到七牛云

    $ npm install qiniu import * as url from 'url'; import * as qiniu from 'qiniu'; @Post('upload') @Use ...

  7. (转)IP协议详解之子网寻址、子网掩码、构造超网

    原文网址:http://www.cnblogs.com/way_testlife/archive/2010/10/05/1844399.html 子网寻址 1. 从两级IP地址到三级IP地址 < ...

  8. [Python学习笔记]组织文件

    shutil 模块 shutil 模块可以让我们很方便的在Python程序中复制.移动.改名和删除文件. 复制文件和文件夹 使用shutil.copy()来复制文件,该函数含两个参数,均为字符串格式的 ...

  9. 1094 The Largest Generation ——PAT甲级真题

    1094 The Largest Generation A family hierarchy is usually presented by a pedigree tree where all the ...

  10. Java 开源办公开发平台 O2OA V5.4.0 发布 | 设计元素搜索功能上线

    O2OA V5.4.0版本此次更新的设计元素搜索功能,可以让用户在海量的脚本.页面.表单.视图等信息中迅速锁定有价值的信息,以便提高用户获取信息的效率.拥有此搜索功能后,在开发过程中,可以加速定位脚本 ...