Android菜单Menu详解

菜单资源文件通常放置在res\menu目录下,在创建项目时,默认不自动创建menu目录,所以需手动创建。
Android Resource Directory→ value menu
或在创建根元素<menu></menu>标记的xml文件对自动气建眼
res→Android Resounce File →Resource type→menu
子元素<item></iten><group></group>

<item>liter>标记常用属性,描述:

andraid: id  设置ID,也就是唯一标识。
android: title  设置标题。
android: alphabeticShortcut  指定字符快捷键。
android: numericShortcut  指定数字快捷键。
android: enabled  是否可用。
android: checkable  是否可选。
android: visible  是否可见。
android: checked  是否已选用。
android: icon  指定图标,需重写onMenuOpened方法并在其中调用设置显示图标才会在列表项中显示图标(重写方法)。

app: actionViewClass  用于指定操作按钮的视图类的 XML 属性。值可为"androidx.appcompat.widget.SearchView"(搜索框)等。

app: showAsAction  该属性用于溢出菜单控制菜单项在导航栏上展示位置。值可为:

always  总是在导航栏上显示菜单图标。
ifRoom  如果导航栏右侧有空间,该项就直接显示在导航栏上,不再放入溢出菜单。
never  从不在导航栏上显示,一直放在溢出菜单列表中。
withText  如果能在导航栏上显示,除了显示图标还要显示该项的文字说明。
collapseActionView  操作视图要折叠为一个按钮,点击该按钮再展示操作视图主要用于Searchview

<group></group>标记常用属性,描述:

android: id  为菜单组设置ID。
android: checkableBehavior  指定菜单组选择行为,值可为none(不可选)、all(多选)、single(单选)。
android: menuCategory  对某单组进行分类,指定优先级,值可为containersystemsecondaryalternative
android: enable  指定该菜单组中全部 单项是否可用
android: visible  指定该菜单组中全部某单项是否可见

<item>标记中还可包含<menu>标记,用于显示子菜单。
<group>标记中可有多个<item>标记,用于组成菜单组。

//例
<?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:title="item1"android:icon="@drawable/zerotwo"app:showAsAction="always"/><item android:title="item2"><menu><item android:title="item2_1"/><item android:title="item2_2"/></menu></item><group><item android:title="item3"/><item android:title="item4"/></group></menu>

1. 上下文菜单

长按注册的控件显示菜单。

public class MainActivity extends AppCompatActivity {protected void onCreate(Bundle savedInstanceState) {... ...TextView textView=findViewById(R.id.textView);registerForContextMenu(textView);}public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {//用于创建菜单(上下文菜单)MenuInflater menuInflater=getMenuInflater().inflate(R.menu.test,menu);}public boolean onContextItemSelected(MenuItem item) {//用于选择菜单项(上下文菜单)int id=item.getItemId();if(id==R.id.~){~}return true;}}

2. 选项菜单

点击标题栏或工具栏最右侧三个点显示菜单

如果隐藏标题栏ActionBar且没有使用工具栏ToolBar(app:menu)将无法使用。

使用ToolBar时要使用 setSupportActionBar( toolBar ) 将工具栏设为操作栏,且为ToolBar的app:menu属性赋值。

public class MainActivity extends AppCompatActivity {public boolean onCreateOptionsMenu(Menu menu) {//用于创建菜单(选项菜单/溢出菜单)MenuInflater menuInflater=getMenuInflater().inflate(R.menu.test,menu);return true;}public boolean onOptionsItemSelected(MenuItem item) {//用于选择菜单项(选项菜单/溢出菜单)int id=item.getGroupId();if(id==R.id.~){~}return true;}}

3. 溢出菜单

溢出菜单和选项菜单并无较大差别,均是点击标题栏ActionBar或工具栏ToolBar最右侧三个点显示菜单
如果隐藏标题栏ActionBar且没有使用工具栏ToolBar(app:menu)将无法使用。

使用ToolBar时要使用 setSupportActionBar( toolBar ) 将工具栏设为操作栏,且为ToolBar的app:menu属性赋值。

菜单栏默认不在某单列表中显示图标;可制作自定义方法来使其显示图标。

//用于使菜单项在列表中显示图片的自定义方法
class MyMenuUtil{public static void setOverflowIconVisible(int featureId,Menu menu){//ActionBar的featureId是8,ToolBar的featureId是108if(featureId%100== Window.FEATURE_ACTION_BAR&&menu!=null){if(menu.getClass().getSimpleName().equals("MenuBuilder")){try {//setOptionalIconsVisible是隐藏方法,需要反射机制调用。Method m=menu.getClass().getDeclaredMethod("setOptionalIconsVisible",Boolean.TYPE);m.setAccessible(true);m.invoke(menu,true);}catch (Exception e){e.printStackTrace();}}}}
}
public class MainActivity extends AppCompatActivity {public boolean onMenuOpened(int featureId, Menu menu) {//打开菜单时调用//设置在菜单栏中显示图标MyMenuUtil.setOverflowIconVisible(featureId,menu);return super.onMenuOpened(featureId, menu);}public boolean onCreateOptionsMenu(Menu menu) {//用于创建菜单(溢出菜单/选项菜单)MenuInflater menuInflater=getMenuInflater().inflate(R.menu.test,menu);return true;}public boolean onOptionsItemSelected(MenuItem item) {//用于选择菜单项(溢出菜单/选项菜单)int itemId=item.getItemId();int groupId=item.getGroupId();if(itemId==R.id.~){~}return true;}
}

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

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

相关文章

无人机航迹规划:狐猴优化算法LO求解无人机路径规划MATLAB(可以修改起始点,地图可自动生成)

一、狐猴优化算法 狐猴优化算法&#xff08;Lemurs Optimizer&#xff0c;LO&#xff09;由Ammar Kamal Abasi等人于2022年提出&#xff0c;该算法模拟狐猴的跳跃和跳舞行为&#xff0c;具有结构简单&#xff0c;思路新颖&#xff0c;搜索速度快等优势。狐猴优化算法&#xff…

JavaScript 进阶问题列表,巩固自己的知识。

不定时更新 JavaScript 进阶问题列表 从基础到进阶&#xff0c;测试你有多了解 JavaScript&#xff0c;刷新你的知识&#xff0c;或者帮助你的 coding 面试&#xff01; &#x1f4aa; &#x1f680; 答案❤️ 1. 输出是什么&#xff1f; function sayHi() {console.log(na…

代码汇总【数据结构与算法】【精致版】

代码汇总【数据结构与算法】【精致版】 学习 第一章 引言 第二章 线性表 顺序表 1-顺序表.h 1-顺序表的测试.c //1.顺序表的初始化 //【算法2-1】 顺序表的初始化 //创建顺序表函数 初始化前n个数据 //2.顺序表的插入 //【算法2-2】顺序表的插入 //3.顺序表的删除 //【…

iSlide2024一款基于PPT的插件工具包含38个设计辅助功能

根据使用者情况表明iSlide 是一款拥有30W素材的PPT高效设计软件&#xff0c;可提高90%工作效率&#xff0c;现全球已有超过1400万使用者&#xff0c;智能排版原创高品模板可商用图形&#xff0c;真正摆脱PPT的束缚&#xff0c;把精力用在该用的地方。我们都明白islide插件功能特…

vue项目中页面遇到404报错

vue页面访问正常&#xff0c;但是一刷新就会404的问题解决办法&#xff1a; 1.解决方法&#xff1a; 将vue的路由模式 mode: history 修改为 mode: hash模式 //router.js文件 const router new Router({//mode: history, mode: hash,routes: [{ path: /, redirect: /login …

nodejs 操作rabbitMQ rascal库(针对amqplib的封装)

Rascal 是一个围绕amqplib 的丰富的 pub/sub 包装器。amqplib 最好的事情之一是它不会对您如何使用它做出假设。另一个是它不尝试抽象AMQP Concepts。因此&#xff0c;该库提供了大量的控制和灵活性&#xff0c;但您有责任采用适当的模式和配置。您需要注意的是&#xff1a; 默…

基于Python OpenCV的金铲铲自动进游戏、D牌...

基于Python OpenCV的金铲铲自动进游戏、D牌... 1. 自动点击进入游戏1.1 环境准备1.2 功能实现2. 自动D牌3. 游戏结束自动退1. 自动点击进入游戏 PS: 本测试只用于交流学习OpenCV的相关知识,不能用于商业用途,后果自负。 1.1 环境准备 需要金铲铲在win10的模拟器,我们这里选…

Vue 3 中,watch 和 watchEffect 的区别

结论先行&#xff1a; watch&#xff1a;需要指明要监听的数据&#xff0c;而且在回调函数中可以获取到属性变化的前后值&#xff1b; 适用于需要精确控制监视范围的情况&#xff1b;也就是需要针对特定数据变化执行操作。 watchEffect&#xff1a;不用指明监听哪个属性&…

python单元测试框架(继承、unittest参数化、断言、测试报告)

一、继承 继承能解决什么问题&#xff1f; unittest每个模块都要用到前提条件以及清理&#xff0c;如果有上百个模块&#xff0c;我们要改域名和浏览器&#xff0c;就会工作量很大特别麻烦&#xff0c;这时我们可以用继承的思想只用改一次 我们可以将前提和清理提出来单独放…

新登录接口独立版变现宝升级版知识付费小程序-多领域素材资源知识变现营销系统

源码简介&#xff1a; 资源入口 点击进入 源码亲测无bug&#xff0c;含前后端源码&#xff0c;非线传&#xff0c;修复最新登录接口 梦想贩卖机升级版&#xff0c;变现宝吸取了资源变现类产品的很多优点&#xff0c;摒弃了那些无关紧要的东西&#xff0c;使本产品在运营和变现…

MVC、MVP、MVVM区别

MVC、MVP、MVVM区别 MVC&#xff08;Model-View-Controller&#xff09; 。是一种设计模式&#xff0c;通常用于组织与应用程序的数据流。它通常包括三个组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&…

TDengine 上榜 BenchCouncil 全球首个开源贡献榜

近日&#xff0c;Bench Council&#xff08;国际测试委员会&#xff09;公布了“世界首个开源贡献榜”&#xff0c;该榜单号称“只以贡献分高下”。值得一提的是&#xff0c;涛思数据、TDengine 上榜 BenchCouncil 发布的开源计算机系统机构榜、成果榜&#xff0c;TDengine 创始…

SQL语句性能优化

1、查询 SQL 尽量不要使用 select *,而是 select 具体字段 反例子: select * from sys_user; 正例子: select id,name from sys_user; 理由如下: 只取需要的字段,节省资源、减少网络开销。select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。…

CDN策略好坏的重要性

CDN加速技术在今天的互联网世界中扮演着至关重要的角色&#xff0c;它可以显著提高网站和应用程序的性能&#xff0c;同时也有助于提供更好的安全性。然而&#xff0c;设定安全策略的好坏对CDN的影响是一个关键的议题&#xff0c;本文将深入探讨这个问题。 CDN&#xff08;内容…

pdfH5实现pdf预览功能

1.引入 npm install pdfh5 2.使用 <view id"pdfBox" class""></view> showPdf(url) {this.pdfh5 new Pdfh5("", {URIenable: false,zoomEnanle: true,maxZoom: 2,pdfurl: url})this.pdfh5.on("complete", function(st…

2、Sentinel基本应用限流规则(2)

2.2.1 是什么 Sentinel 是阿里中间件团队开源的&#xff0c;面向分布式服务架构的轻量级高可用流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。 2.2.2 基本概念 • 资源 (需要被保护的东西…

ASP.net C# 用Aspose.pdf实现pdf合并

直接上代码&#xff0c;供参考&#xff0c;备忘&#xff01; using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Data.SqlClient; using System.Xml; using System…

盘点 MySQL 创建内部临时表的所有场景

作者总结了 MySQL 中所有触发使用内部临时表的场景。 作者&#xff1a;刘嘉浩&#xff0c;爱可生团队 DBA 成员&#xff0c;重度竞技游戏爱好者。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文约 2000 字&#xff…

宝马——使用人工智能制造和驾驶汽车

德国汽车制造商宝马(BMW)每年在全球制造和销售250万台汽车&#xff0c;其品牌包括宝马、MINI和劳斯莱斯。 宝马汽车以其卓越的性能和对新技术的应用而著名&#xff0c;它是道路上最精致的汽车之一&#xff0c;并且和其竞争对手戴姆勒(Daimler)一样&#xff0c;在将自动驾驶汽车…

Redis中的Zset类型

目录 Zset的相关命令 zadd zrange zcard zcount zrevrange zrangebyscore zpopmax bzpopmax zpopmin和bzpopmin zrank zrevrank zscore zrem zremrangebyrank zremrangebyscore 操作集合间的命令 zinterstore和zunionstore 内部编码 Zset的应用场景 Zset表…