学习Android的第二十二天
目录
Android ContextMenu 上下文菜单
ContextMenu
范例
参考文档
Android SubMenu 子菜单
范例
参考文档
Android PopupMenu 弹出菜单
范例
参考文档
Android ContextMenu 上下文菜单
在Android开发中,ContextMenu(上下文菜单)为用户提供了一种简便的方式来执行对特定组件的操作。例如,长按列表中的一个项目时,可能会出现一个菜单,让用户选择“编辑”、“删除”等操作。
ContextMenu
Android提供了一种非常简单的方式来创建和处理上下文菜单(ContextMenu),主要通过在Activity中重写几个关键方法来实现。
这种方式不依赖于XML布局文件或是直接实例化某个类,而是通过与Activity生命周期紧密相关的几个回调方法来管理。
1. registerForContextMenu(View view)
- 说明:这个方法用于为特定的View注册上下文菜单。当用户长按该View时,就会触发上下文菜单的显示。
- 使用场景:通常在Activity的onCreate()方法中调用此方法,为想要显示上下文菜单的View注册。
2. onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
- 说明:当注册了上下文菜单的View被长按时,这个方法会被调用。在这里,你可以定义上下文菜单的内容,比如菜单项。
- 使用场景:需要重写这个方法来填充上下文菜单,例如添加菜单项。
3. onContextItemSelected(MenuItem item)
- 说明:用户选择上下文菜单中的某个项时,这个方法会被触发。在这里,你可以处理用户的点击事件。
- 使用场景:需要重写这个方法来响应用户对上下文菜单项的选择。
调用顺序和流程
- 注册上下文菜单:在onCreate()方法中,通过调用registerForContextMenu(view)为特定的View注册上下文菜单。
- 创建上下文菜单:当用户长按已注册的View时,会自动调用onCreateContextMenu(menu, v, menuInfo)方法,在这里定义上下文菜单的内容。
- 响应菜单项点击:用户点击上下文菜单中的某个项时,onContextItemSelected(MenuItem item)方法会被调用,在这里处理点击事件。
范例
1、修改 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><ListViewandroid:id="@+id/listview"android:layout_width="match_parent"android:layout_height="wrap_content" />
</LinearLayout>
2、修改 MainActivity.java
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;public class MainActivity extends AppCompatActivity {ListView listView;String[] items = {"Java", "C#", "Python", "Ruby", "PHP", "C++", "Go", "Swift", "Kotlin", "JavaScript"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = findViewById(R.id.listview);ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);listView.setAdapter(adapter);// 注册 Context MenuregisterForContextMenu(listView);}// 创建 Context Menu@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);getMenuInflater().inflate(R.menu.context_menu, menu);}// 处理 Context Menu 项点击事件@Overridepublic boolean onContextItemSelected(MenuItem item) {AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();int itemId = item.getItemId();if (itemId == R.id.action_edit) {Toast.makeText(this, "编辑 " + items[info.position], Toast.LENGTH_SHORT).show();return true;} else if (itemId == R.id.action_delete) {Toast.makeText(this, "删去 " + items[info.position], Toast.LENGTH_SHORT).show();return true;} else {return super.onContextItemSelected(item);}}
}
3、在res/menu目录下创建一个名为context_menu.xml的文件(如果没有menu目录,则需要创建它)。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/action_edit"android:title="编辑"/><itemandroid:id="@+id/action_delete"android:title="删去"/>
</menu>
参考文档
- Android menus
Android SubMenu 子菜单
在Android开发中,SubMenu(子菜单)是一种常用的UI组件,允许在一个主菜单项下创建一个二级菜单。这对于分类和组织复杂的菜单项非常有用,可以帮助用户更好地导航应用的功能。(子菜单不是单独存在的,而是在 OptionMenu 或者 ContextMenu 中可以添加子菜单)
范例
1、创建菜单资源文件
首先,需要在res/menu目录下创建一个XML文件来定义菜单项,比如main_menu.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/create"android:title="新建" /><item android:id="@+id/edit"android:title="编辑" /></group><item android:id="@+id/saveall"android:title="子菜单" ><menu xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+id/save"android:title="保存" /><item android:id="@+id/save_as"android:title="另存为..." /><itemandroid:id="@+id/save_all"android:title="保存全部" /></menu></item><item android:id="@+id/help"android:title="帮助" />
</menu>
2、修改 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_pop"android:text="长按我弹出上下文菜单"android:layout_width="wrap_content"android:layout_height="wrap_content" />
</LinearLayout>
3、修改 MainActivity.java
package com.example.myapplication;import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btnPop = findViewById(R.id.btn_pop);registerForContextMenu(btnPop);}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);getMenuInflater().inflate(R.menu.main_menu, menu);}@Overridepublic boolean onContextItemSelected(MenuItem item) {int itemId = item.getItemId();if (itemId == R.id.create) {// 处理新建操作return true;} else if (itemId == R.id.edit) {// 处理编辑操作return true;} else if (itemId == R.id.save) {// 处理保存操作return true;} else if (itemId == R.id.save_as) {// 处理另存为操作return true;} else if (itemId == R.id.save_all) {// 处理保存全部操作return true;} else if (itemId == R.id.help) {// 处理帮助操作return true;} else {return super.onContextItemSelected(item);}}}
参考文档
- Android menus
Android PopupMenu 弹出菜单
在Android开发中,PopupMenu是一个非常有用的组件,它可以在用户界面的任何位置显示一个弹出菜单。这个菜单可以通过编程方式动态创建,也可以从XML菜单资源文件加载。
PopupMenu在Android中是一个用于显示上下文菜单的非常方便的组件,它可以附着在指定的视图(View)上。PopupMenu有几种构造方法允许你根据需要选择不同的参数来创建弹出菜单。以下是如何使用这些构造方法以及如何设置和显示PopupMenu的具体步骤:
- 基本构造方法:PopupMenu(Context context, View anchor): 这是最基本的构造函数,只需要上下文(通常是Activity)和锚点视图(即触发弹出菜单的视图)。
- 指定重力的构造方法:PopupMenu(Context context, View anchor, int gravity): 这个构造函数除了上下文和锚点视图外,还允许你指定弹出菜单的重力(gravity),例如Gravity.END,控制菜单显示的位置相对于锚点视图。
- 完全自定义样式的构造方法:PopupMenu(Context context, View anchor, int gravity, int popupStyleAttr, int popupStyleRes): 这是最灵活的构造函数,它除了上述参数外,还允许你通过popupStyleAttr和popupStyleRes指定弹出菜单的样式。
范例
步骤1: 创建菜单资源文件
首先,在res/menu目录下创建一个名为main_menu.xml的菜单资源文件。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/action_item1"android:title="选项 1"/><itemandroid:id="@+id/action_item2"android:title="选项 2"/><itemandroid:id="@+id/action_item3"android:title="选项 3"/>
</menu>
步骤2: 修改 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:gravity="center"tools:context=".MainActivity"><Buttonandroid:id="@+id/button_show_popup"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="显示弹出菜单"android:layout_centerInParent="true"/>
</LinearLayout>
步骤3: 修改 MainActivity.java
package com.example.myapplication;import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button buttonShowPopup = findViewById(R.id.button_show_popup);buttonShowPopup.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 创建PopupMenu实例PopupMenu popupMenu = new PopupMenu(MainActivity.this, v, Gravity.RIGHT);// 从XML资源文件中填充菜单项popupMenu.getMenuInflater().inflate(R.menu.main_menu, popupMenu.getMenu());// 设置菜单项点击事件popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {Toast.makeText(MainActivity.this, "选中了: " + item.getTitle(), Toast.LENGTH_SHORT).show();return true;}});// 显示PopupMenupopupMenu.show();}});}
}
参考文档
- Android menus
相关文章:
学习Android的第二十二天
目录 Android ContextMenu 上下文菜单 ContextMenu 范例 参考文档 Android SubMenu 子菜单 范例 参考文档 Android PopupMenu 弹出菜单 范例 参考文档 Android ContextMenu 上下文菜单 在Android开发中,ContextMenu(上下文菜单)为…...

JavaScript——流程控制(程序结构)
JavaScript——流程控制(程序结构) 流程控制就是来控制我们的代码按照什么结构顺序来执行。更倾向于一种思想结构。 流程控制分为三大结构:顺序结构、分支结构、循环结构 1、顺序结构 代码从上往下依次执行,从A到B执行&#x…...

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?
原文链接:如何用ChatGPTGEEENVIPython进行高光谱,多光谱成像遥感数据处理? 第一:遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二:ChatGPT ChatGPT可以做什么? ChatGPT演示使用 …...

AIGC工具( 7个 )
人工智能技术有好的一方面,又不好的地方,要区别对待,吸取精华,去其糟粕。目前市场上有很多AI大模型,可以支持聊天,写文稿,创作等,部分可以生成图片,以下是7个很不错的免费…...

学习Java的第一天
一、Java简介 Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling和同事们共同研发,并在 1995 年正式推出。 后来 Sun 公司被 Oracle (甲骨文)公司收购,Jav…...
【设计模式】工厂模式与抽象工厂模式
工厂方法 以图书馆管理系统为例,需要API提供查询不同专业分类的书目列表,一般实现, class LibraryManager { public:LibraryManager() {}//按专业分类查询BookList Query(Type type) {if(type TA) {return ...;} else if (type TB) {} el…...

使用plasmo框架开发浏览器插件,注入contents脚本和给页面添加UI组件
plasmo:GitHub - PlasmoHQ/plasmo: 🧩 The Browser Extension Framework plasmo是一个开发浏览器插件的框架,支持使用react和vue等技术,而且不用手动管理manifest.json文件,框架会根据你在框架中的使用,自…...
python并发 惰性处理大型数据集
惰性计算是一种编程策略,它使得程序在何时执行计算的决定推迟到需要结果时才进行。这种策略的好处在于,它允许程序处理大规模数据或者需要大量计算的任务时节省内存和计算资源。 举例来说,当我们调用 Python 中的 range() 函数时,…...

Docker将本地的镜像上传到私有仓库
使用register镜像创建私有仓库 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…...

[LeetBook]【学习日记】有效数字——状态机
题目 有效数字 有效数字(按顺序)可以分成以下几个部分: 若干空格一个小数或者整数(可选)一个’e’或’E’,后面跟着一个整数若干空格 小数(按顺序)可以分成以下几个部分:…...
学习目标2024
技术: 什么是 Nacos apifox 业务: 域统一...
引入js,刷新清除缓存
一、这种会让所有的css/js资源重新加载 <meta http-equiv"pragram" content"no-cache"> <meta http-equiv"cache-control" content"no-cache, no-store, must-revalidate">二、加时间戳 每次引入,后面版本号都…...

【VSCODE修改代码行间距】解决方案
在我们编码的过程中,由于显示字体和显示器的不同,会需要调整行间距,在vscode默认的选项中没有看到设定行间距的选项,不过,可以手动修改配置档达到目的。 1.打开设置 2.打开配置档,手动进行设定 3.在选项中添…...

lvs+keepalive
虚拟路由冗余协议(Virtual Router Redundancy Protocol,简称VRRP) VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关,实现网关的备份。 协议版本: VRRPv2(常用&…...
用spark读取及存储数据
文章目录 读取数据存储数据 读取数据 data spark.sql("""select * from temp.tables""") data.show(3)# 转成pandas方式 # df data.toPandas() # df.head(3)存储数据 table "temp.new_tables" data.write.format("hive"…...

蓝牙 | 软件: Qualcomm BT Audio 问题分析(4)----检查MIPS使用情况
大家好! 我是“声波电波还看今朝”成员的一位FAE Devin.wen,欢迎大家关注我们的账号。 今天给大家大概讲解“如何排查Qualcomm BT Audio”的疑难杂症(四):MIPS检查。 如果大家还没有注册我们大大通的账号,…...

【实战】K8S集群部署nacos并接入Springcloud项目容器化运维
文章目录 前言Nacos集群搭建Spring cloud配置nacos将Springcloud项目部署在k8s写在最后 前言 相信很多同学都开发过以微服务为架构的系统,开发微服务必不可少要使用注册中心,比如nacos\consul等等。当然在自动化运维流行的今天,我们也会将注…...
prometheus监控zookeeper方案
这里要求zookeeper版本必须达到3.6或以上,用的是官方自带的监控信息。 官方下载地址 https://zookeeper.apache.org/releases.html#download 然后在zookeeper的配置文件,比如zoo.cfg最后面加上这一段 metricsProvider.classNameorg.apache.zookeeper.…...
智能照明控制系统的优点有哪些
智能照明控制系统在会展中心中应用的功能和优点: 1实现照明控制智能化 在使用智能照明控制系统之后,能够将系统工作在全自动的状态下,系统能够预先设置好若干个基本切换状态,并且还能够根据预先设定的时间自动的在展馆各种工作状…...
Cent OS 安装 vmware tools
一、先挂载iso镜像 二、使用blkid命令,可看到/dev/sr0 blkid 创建一个目录并挂载cdrom mkdir /mnt/cdrom mount -t iso9660 /dev/cdrom /mnt/cdrom/ 挂载完成后,在/mnt/cdrom/目录即可看到一个.tar.gz的包VMwareTools-10.1.7-5541682.tar.gz&#x…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析
MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录,这个目录下存放着许多可执行文件。与其他系统的可执行文件类似,这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中,用…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...