Android Studio 之 菜单 Menu

选项菜单 OptionsMenu

用xml添加(更建议使用)

创建一个菜单布局 :

  • 在 res文件下新建一个menu 目录,此时的菜单id为:R.menu.option

<?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"><!-- 菜单可以嵌套 但顶多允许含有一层子菜单--><!--showAsAction:always 直接在标题栏显示 never 不显示 有图标就显示图标--><itemandroid:id="@+id/m1"android:title="选项1"app:showAsAction="always"/><itemandroid:id="@+id/m2"android:title="选项2"/><itemandroid:id="@+id/m3"android:title="选项3"/><itemandroid:id="@+id/m4"android:title="选项4"><menu><item android:title="子菜单1"/><item android:title="子菜单2"/><item android:title="子菜单3"/><item android:title="子菜单4"/></menu></item></menu>

在需要添加选项菜单的布局对应的activity中创建选项菜单-此时是MainActivity

getMenuInflater().inflate(R.menu.option,menu); // 加载菜单资源
// 创建optionMenu@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// 加载菜单资源getMenuInflater().inflate(R.menu.option,menu);return true;}// optionMenu 的选中方法@Overridepublic boolean onOptionsItemSelected(@NonNull MenuItem item) {if (item.getItemId() == R.id.m1) {Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show();} else if (item.getItemId() == R.id.m2) {Toast.makeText(this,item.getTitle(),Toast.LENGTH_SHORT).show();}return super.onOptionsItemSelected(item);}

使用Java添加

  • Menu 类 SubMenu 子菜单类
  • Menu类参数:组id 菜单项id 菜单项序号 菜单项名称

在onCreateOptionsMenu 方法里利用以上类添加选项菜单,菜单项序号是指菜单项的位置

// 创建optionMenu@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// 加载菜单资源/* 通过xml设计 */// getMenuInflater().inflate(R.menu.option,menu);/* 纯代码设计* Menu 类 SubMenu 子菜单类*//* Menu 类参数:组id 菜单项 id 菜单项序号 菜单项名称 */menu.add(1,1,3,"菜单1");menu.add(1,2,2,"菜单2");SubMenu subMenu = menu.addSubMenu(1,3,1,"子菜单的主菜单");subMenu.add(2,22,1,"子菜单2");subMenu.add(2,11,2,"子菜单1");return true;}

 

上下文菜单 ContextMenu

长按按钮弹出菜单

创建菜单布局

  • 在 res文件下新建一个menu 目录,此时的菜单id为:R.menu.context
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/ctx1"android:title="上下文菜单item1" /><itemandroid:id="@+id/ctx2"android:title="上下文菜单item2" /><itemandroid:id="@+id/ctx3"android:title="上下文菜单item3" /><itemandroid:id="@+id/ctx4"android:title="上下文菜单item4" /><itemandroid:title="上下文菜单item5"><menu><itemandroid:id="@+id/z_ctx1"android:title="子菜单item1" /><itemandroid:id="@+id/z_ctx2"android:title="子菜单item2" /><itemandroid:id="@+id/z_ctx3"android:title="子菜单item3" /></menu></item>
</menu>

创建菜单

在activity_main.xml里添加一个按钮用以打开上下文菜单

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:gravity="center"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/ctx_btn"android:layout_width="200dp"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="打开contextMenu"/></LinearLayout>

 上下文菜单的使用步骤:

1.注册

在 activity_main.xml 布局对应的 activity 中的 onCreate() 方法中进行注册

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// ContextMenu 上下文菜单的使用// 1.注册registerForContextMenu(findViewById(R.id.ctx_btn));}

2.创建 - 覆盖父类的 onCreateContextMenu 方法

// 2.创建contextMenu@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {getMenuInflater().inflate(R.menu.context,menu);}

3菜单项的操作 - 覆盖父类的 onContextItemSelected 方法

// 3.contextMenu 菜单项选项操作@Overridepublic boolean onContextItemSelected(@NonNull MenuItem item) {int itemId = item.getItemId();Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();return super.onContextItemSelected(item);}

上下文菜单 - 上下文操作模式 

 菜单会出现在状态栏的位置

1. 实现接口 ActonMode.CallBack 中不同的回调方法

ActionMode.Callback ac =new ActionMode.Callback(){// 创建:在启动上下文操作模式(startActionMode(Callback))时调用@Overridepublic boolean onCreateActionMode(ActionMode mode, Menu menu) {Log.e("上下文操作模式","--创建--");getMenuInflater().inflate(R.menu.context,menu);return true;}// 准备:在创建方法后进行调用@Overridepublic boolean onPrepareActionMode(ActionMode mode, Menu menu) {Log.e("上下文操作模式","--准备--");return false;}// 菜单项被点击@Overridepublic boolean onActionItemClicked(ActionMode mode, MenuItem item) {/* 环境变量此时需要这样是因为这是一个内部类 ButtonActivity.this */Log.e("上下文操作模式","--点击--");Toast.makeText(ButtonActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();return true;}// 结束:上下文操作模式结束时调用@Overridepublic void onDestroyActionMode(ActionMode mode) {Log.e("上下文操作模式","--结束--");}};


2. 添加一个按钮用以打开,上下文操作模式

<Buttonandroid:id="@+id/ctx_opbtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="上下文 ContextMenu 操作模式"/>

3.在View的长按事件中启动上下文操作模式 

findViewById(R.id.ctx_opbtn).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {startActionMode(ac);return false;}});

弹出式菜单

一般出现在被绑定的View下方,如果下方没有空间则出现在上方

添加一个按钮

 <Buttonandroid:id="@+id/pop_btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="弹出式菜单"/>

为这个按钮添加点击事件,并将弹出式菜单绑定在按钮的点击事件上 

// 将弹出式菜单绑定在按钮的点击事件上Button popbtn = findViewById(R.id.pop_btn);popbtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 1.实例化 PopupMenu 对象/* 参数一 上下文环境* 参数二 被锚定的(绑定)的button*/PopupMenu popupMenu = new PopupMenu(ButtonActivity.this,popbtn);// 2.加载菜单资源:利用MenuInflater将Menu资源加载到PopMenu.getMenu() 所返回的Menu对象中popupMenu.getMenuInflater().inflate(R.menu.context,popupMenu.getMenu());// 3.菜单子项点击操作popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {Toast.makeText(ButtonActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();return false;}});// 显示菜单popupMenu.show();}});

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/639157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不同开发语言在进程、线程和协程的设计差异

不同开发语言在进程、线程和协程的设计差异 1. 进程、线程和协程上的差异1.1 进程、线程、协程的定义1.2 进程、线程、协程的差异1.3 进程、线程、协程的内存成本1.4 进程、线程、协程的切换成本 2. 线程、协程之间的通信和协作方式2.1 python如何实现线程通信&#xff1f;2.2 …

【Unity】AB包下载

【Unity】AB包下载 1.使用插件打AB包 a.AB包分类 一般地&#xff0c;将预制体作为AB包资源&#xff0c;不仅需要对预制体本身进行归类&#xff0c;还要对其涉及的动画&#xff08;AnimationClip&#xff09;、动画状态机&#xff08;AnimatorController&#xff09;、以及所…

《A++ 敏捷开发》- 5 量化管理从个人开始

我&#xff1a;你们管理层和客户都比较关心项目的进度&#xff0c;项目是否能按时完成&#xff1f;请问你们过去的项目如何&#xff1f; 开发&#xff1a;我们现在就是走敏捷开发&#xff0c;两周一个迭代。每次迭代前&#xff0c;我们聚一起开会&#xff0c;把所有用户故事按优…

Dubbo 3.2版本分析Provider启动时操作

Dubbo 3.2版本分析Provider启动时操作 前言例子分析onStarting 模块doStart 模块 小结 前言 上一篇文章&#xff0c;我们分析了 Dubbo 3.2 版本在 Provider 启动前的操作流程&#xff0c;这次我们具体分析具体它的启动过程&#xff0c;揭开它的神秘面纱。 例子 这里我们还是…

【ZYNQ入门】第八篇、基于Lwip构建TCP服务器

目录 第一部分、基础知识 1、小白入门必看文章 2、什么是Lwip&#xff1f; 3、什么是TCP/IP协议&#xff1f; 4、MAC地址、IP地址、子网掩码、网关 4.1、MAC地址 4.2、IP地址 4.3、子网掩码 4.4、网关 第二部分、硬件搭建 第三部分、软件代码 1、SDK工程的建立 2、…

数据结构与算法-二叉树-从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder …

云盘后端分析

1.验证码 用的是外面找的 2.发送邮箱验证码 配置邮箱的授权码 我们在发送邮箱的时候&#xff0c;需要把那个值传到数据库中&#xff0c;数据库中有它的状态&#xff0c;我们需要根据状态判断它是注册还是找回密码 我们在发送邮箱之前&#xff0c;先从session里面得到我们验证…

Rocky Linux 8.9 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

某度网盘提取下载链接JS逆向分析(一)

本次目标网址如下&#xff0c;使用base64解码后获得 aHR0cHM6Ly9wYW4uYmFpZHUuY29tL3MvMUZsaDBPeGpZamZJTFVZWUQzTm9fVnc 链接提取码为&#xff1a;ly12 本次逆向分析分为上下两篇文章说明&#xff0c;一为讲解如何从原链接通过逆向拿到下载链接&#xff0c;二为逆向登录拿到co…

flink结合Yarn进行部署

1. 什么是Yarn模式部署Flink 独立&#xff08;Standalone&#xff09;模式由 Flink 自身提供资源&#xff0c;无需其他框架&#xff0c;这种方式降低了和其他第三方资源框架的耦合性&#xff0c;独立性非常强。但我们知道&#xff0c;Flink 是大数据计算框架&#xff0c;不是资…

C++学习笔记——指针

1&#xff0c;指针的基本概念 指针的作用&#xff1a;可以通过指针间接访问内存 内存的编号是从0开始记录的&#xff0c;一般用十六进制数字表示可以利用指针变量保存地址 上图中的p就是a变量的指针&#xff0c;也可以记作*a 2&#xff0c;指针变量的定义和使用 指针变量定…

Linux操作系统——理解文件系统

预备知识 到目前为止&#xff0c;我们所学习到的关于文件的操作&#xff0c;全部都是基于文件被打开&#xff0c;被访问&#xff0c;访问期间比较重要的有重定向&#xff0c;缓冲区&#xff0c;一切皆文件&#xff0c;当我们访问完毕的时候需要将文件关闭&#xff0c;关闭时那…

3.RHCSA脚本配置及通过node2改密码

运行脚本发现node2不成功 脚本破解 选第二个 Ctrl x 换行 破解成功后做node2的改密码题 回到redhat, 发现检测程序检测密码题成功,得了8分.

DBA技术栈MongoDB: 数据增改删除

该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中&#xff0c;根据需求选择适合的插入方式。 案例1&#xff1a;插入单个文档 db.visitor.insert({…

【蓝桥杯冲冲冲】动态规划初步[USACO2006 OPEN] 县集市

蓝桥杯备赛 | 洛谷做题打卡day13 文章目录 蓝桥杯备赛 | 洛谷做题打卡day13题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示样例说明数据规模与约定 思路&#xff1a;方程&#xff1a; 题解代码我的一些话 [USACO2006 OPEN] 县集市 The County Fair 题目描述 每年…

Threejs实现立体3D园区解决方案及代码

一、实现方案 单独贴代码可能容易混乱&#xff0c;所以这里只讲实现思路&#xff0c;代码放在最后汇总了下。 想要实现一个简单的工业园区、主要包含的内容是一个大楼、左右两片停车位、四条道路以及多个可在道路上随机移动的车辆、遇到停车位时随机选择是否要停车&#xff0…

解决ssh登录Permission denied, please try again

现象截图如下&#xff1a; 确定root的密码是正确的&#xff0c;最后的原因找到了&#xff0c;是远程的服务器&#xff0c;禁用了root账户可以被远程访问的权限。开启操作如下&#xff1a; 1.编辑配置文件 vi /etc/ssh/sshd_config 2.文件中找到PermitRootLogin #PermitRoo…

seaborn可视化示例详解

目录 1、散点图 2、散点图回归线 3、折线图 4、频数柱状图 5、分组散点图 6、箱型图 7、数值分布柱状图 8、频数分布图 9、联合分布图 10、数值分布柱状图 11、相关系数热力图 划重点 少走10年弯路 Seaborn是一个基于Python的数据可视化库&#xff0c;Seaborn提供了许多用…

链表|数据结构|C语言深入学习

什么是链表 离散&#xff0c;就是“分离的、散开的” 链表是什么样子的&#xff1a; 有限个节点离散分配 彼此间通过指针相连 除了首尾节点&#xff0c;每个节点都只有一个前驱节点和一个后继节点 首节点没有前驱结点&#xff0c;尾节点没有后继节点 基本概念术语&#xf…

1.使用分布式文件系统Minio管理文件

分布式文件系统DFS分类 文件系统 文件系统是操作系统用于组织管理存储设备(磁盘)或分区上文件信息的方法和数据结构,负责对文件存储设备空间进行组织和分配,并对存入文件进行保护和检索 文件系统是负责管理和存储文件的系统软件&#xff0c;操作系统通过文件系统提供的接口去…