先来认识一下上下文菜单是什么样子的?如图,当长按一个控件时弹出来的菜单叫做上下文菜单:

图中第一个和第二个就是一个上下文菜单,第二个菜单里面还有一层菜单,这个上下文菜单被绑定到注册按钮中,也就是长按注册按钮后就会弹出上下文菜单,当然这个上下文菜单也可以绑定到其他的控件中,看自己的意愿了。

下面我们就来看看如何实现这么样的一个功能吧!

首先就是新建一个context.xml文件:

然后就是编写context.xml文件了:里面就是放了两个菜单,在第二个菜单里面又放了两个菜单。

剩下的就是怎么把菜单和按钮绑定和每个菜单的点击事件了:

1.注册

registerForContextMenu(findViewById(R.id.button));  通过这句话来注册,也就是把这个菜单和id为button的按钮绑定,长按id为button的按钮后弹出菜单。

2.创建

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);getMenuInflater().inflate(R.menu.context,menu);
}

3.菜单项的操作

@SuppressLint("NonConstantResourceId")
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {int id = item.getItemId();if (id == R.id.diyi){Toast.makeText(this, "第一个按钮被按下", Toast.LENGTH_SHORT).show();}if (id == R.id.dier){Toast.makeText(this, "第2个按钮被按下", Toast.LENGTH_SHORT).show();}if (id == R.id.disan){Toast.makeText(this, "第3个按钮被按下", Toast.LENGTH_SHORT).show();}if (id == R.id.disi){Toast.makeText(this, "第4个按钮被按下", Toast.LENGTH_SHORT).show();}return super.onContextItemSelected(item);
}

通过以上3步就能把上下文菜单调出来了,这个实现的是在屏幕中间弹出上下文菜单,还有一种是在屏幕顶部出现上下文菜单,这个在顶部出现上下文菜单的方法是:

想要实现上图这样的功能,为按钮设置上下文操作模式,要分为两步:

第一步:监听按钮的长按事件,设置上下文模式,调用回调函数。

findViewById(R.id.button).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {startActionMode(cd);return true;}
});

第二步:重写创建菜单的方法:

 @Override  //重写创建菜单的方法public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu,menu); //获取菜单对象return true;}

第三步:实现接口ActionMode CallBack,也就是重写回调函数:

 ActionMode.Callback cd = new ActionMode.Callback() {// 创建    在启动上下文操作模式(startActionMode(Callback))时调用@Overridepublic boolean onCreateActionMode(ActionMode actionMode, Menu menu) {Toast.makeText(MainActivity.this, "上下文被创建", Toast.LENGTH_SHORT).show();getMenuInflater().inflate(R.menu.context,menu);return true;}// 准备    在创建方法后进行调用@Overridepublic boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {Toast.makeText(MainActivity.this, "上下文被准备", Toast.LENGTH_SHORT).show();return true;}//当选项被点击时调用@Overridepublic boolean onActionItemClicked(ActionMode Mode, MenuItem Item) {int id = Item.getItemId();if(id == R.id.diyi){Toast.makeText(MainActivity.this, "第1项被点击", Toast.LENGTH_SHORT).show();}if(id == R.id.dier){Toast.makeText(MainActivity.this, "第2项被点击", Toast.LENGTH_SHORT).show();}if(id == R.id.disan){Toast.makeText(MainActivity.this, "第3项被点击", Toast.LENGTH_SHORT).show();}if(id == R.id.disi){Toast.makeText(MainActivity.this, "第4项被点击", Toast.LENGTH_SHORT).show();}return true;}//上下文操作模式结束时被调用@Overridepublic void onDestroyActionMode(ActionMode actionMode) {Toast.makeText(MainActivity.this, "上下文操作结束了!", Toast.LENGTH_SHORT).show();}};

整体的代码:

package com.example.myapplication4;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});findViewById(R.id.textview1).setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View view) {startActionMode(cd);return true;}});}@Override  //重写创建菜单的方法public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu,menu); //获取菜单对象return true;}ActionMode.Callback cd = new ActionMode.Callback() {@Overridepublic boolean onCreateActionMode(ActionMode actionMode, Menu menu) {getMenuInflater().inflate(R.menu.menu, menu);Toast.makeText(MainActivity.this, "创建成功", Toast.LENGTH_SHORT).show();return true;}@Overridepublic boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {Toast.makeText(MainActivity.this, "准备成功", Toast.LENGTH_SHORT).show();return true;}@Overridepublic boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {int id = menuItem.getItemId();if(id == R.id.diyi){Toast.makeText(MainActivity.this, "第一项被点击", Toast.LENGTH_SHORT).show();}else if(id == R.id.dier){Toast.makeText(MainActivity.this, "第2项被点击", Toast.LENGTH_SHORT).show();}else if(id == R.id.disan){Toast.makeText(MainActivity.this, "第3项被点击", Toast.LENGTH_SHORT).show();}return true;}@Overridepublic void onDestroyActionMode(ActionMode actionMode) {Toast.makeText(MainActivity.this, "被销毁", Toast.LENGTH_SHORT).show();}};}

通过以上的设置,就能实现上下文菜单的操作了。

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

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

相关文章

fabric启动节点var/hyperledger/production: permission denied

场景我在节点的compose文件中进行了数据挂载:- ../../data/bank1/peer1:/tmp/hyperledger/bank1/peer1但是运行是依然报错为var/hyperledger/production的权限问题,并且我也已经对../../data/bank1/peer1目录设置了操作权限services:peer1-bank1:contain…

uni-app + Vue3 开发展示 echarts 图表

场景:使用 uni-app 开发手机端,需要展示 echarts 图表 1. 打开 uni-app 官网 https://uniapp.dcloud.net.cn/ 2. 点击右上角搜索 3. 点击插件市场,搜索 echarts 找到 echarts 插件 4. 下载到自己的项目中 使用详情在该页面下方.

给AI配一台手机+电脑?智谱AutoGLM上线!

早上刚坐进地铁,对着手机随口说句 “整理上周销售周报”,等你到公司打开电脑,Excel 数据统计表、PPT 汇报版已经整整齐齐躺在桌面 —— 这不是科幻片里的画面,而是智谱 AutoGLM 2.0 带来的真实体验。2025年8月20日,智谱…

NGUI--游戏登录、注册和服务器选择系统​​

项目核心思路该项目实现了一个完整的游戏账号流程:​​用户侧流程​​:新用户注册 -> 返回登录 -> 输入账号密码 -> 选择游戏服务器 -> 进入游戏。​​数据管理​​:所有数据(账号信息、服务器列表、用户选择&#xf…

自动化测试框架是软件测试的核心基础设施,通过预设规则和脚本自动执行测试用例,显著提高测试效率和覆盖率。

1. 自动化测试框架1.1 概述自动化测试框架是软件测试的核心基础设施,通过预设规则和脚本自动执行测试用例,显著提高测试效率和覆盖率。现代AI驱动的自动化测试框架结合了机器学习、自然语言处理和计算机视觉技术,实现了更智能的测试用例生成、…

在 Ubuntu 系统中利用 conda 创建虚拟环境安装 sglang 大模型引擎的完整步骤、版本查看方法、启动指令及验证方式

以下是在 Ubuntu 系统中利用 conda 创建虚拟环境安装 sglang 大模型引擎的完整步骤、版本查看方法、启动指令及验证方式,全程使用清华源加速,并包含关键注意事项: 一、完整安装步骤(基于 conda + 清华源) 1. 准备工作:安装 conda 并配置清华源 (1)安装 Miniconda #…

Unity Excel数据导入工具

UnityExcelImporterX - Unity Excel数据导入工具 自动将Excel文件(.xls, .xlsx)中的数据转换为Unity的ScriptableObject资源。 项目基于unity-excel-importer,增加了一些新特性。项目地址:github.com/nayaku/UnityExcelImporter…

np.linalg 函数一览

📚 常用 np.linalg 函数一览下面是一些最常用的功能和示例:1. np.linalg.norm() —— 计算向量或矩阵的范数python深色版本import numpy as npv np.array([3, 4]) print(np.linalg.norm(v)) # L2 范数(模长): √(34) 5.0A np.…

Linux入门(二)

计算机原理系列 欢迎大家关注「海拉鲁知识大陆」 多交流不迷路 Linux入门(二) 在上一章Linux入门(一)中rm -rf /是比较简单的哈,那么升级一下:xargs指令的作用是啥呢? 1.进程 应用的可执行文件是放在文件系统里&a…

开发与维护nodejs工具库或自定义npm包

h5打开以查看 一、初始设置:为成功发布做好准备 1. 项目初始化与结构 bash # 创建项目目录并初始化 mkdir my-awesome-lib cd my-awesome-lib npm init -y 推荐的项目结构: text my-awesome-lib/ ├── src/ # 源代码目录 │ └──…

IntelliJ IDEA 的 Git 功能

1. 克隆(Clone)项目 这是你开始的第一步。你需要将远程仓库的代码克隆到本地。 打开 IDEA,选择 Get from VCS。在弹出的窗口中,选择 Git。粘贴远程仓库的 URL(通常来自 GitHub、GitLab 等)。选择一个本地目…

fastapi全局注入mysql,单数据库

1、封装sql连接 test_db.py from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker from fastapi import Request, Depends# 1. 数据库连接配置 async_engine create_async_engine("mysqlaiomysql://root:root…

深度学习常见应用算力要求?

深度学习常见应用的算力要求,首先需要明确算力的核心衡量维度:计算能力:以每秒浮点运算次数(FLOPS,如 TF32/FP16/FP8 精度下的吞吐量)衡量,决定任务运行速度;显存容量:决…

邪修实战系列(5)

1、第一阶段邪修实战总览(9.1-9.30) 把第一阶段(基础夯实期)的学习计划拆解成极具操作性的每日行动方案。这个计划充分利用我“在职学习”的特殊优势,强调“用输出倒逼输入”,确保每一分钟的学习都直接服务…

Python TensorFlow的CNN-LSTM-GRU集成模型在边缘物联网数据IoT电动汽车充电站入侵检测应用

全文链接:https://tecdat.cn/?p43881 原文出处:拓端抖音号拓端tecdat 随着物联网(IoT)技术在电动汽车充电站(EVCS)中的普及,充电站不仅成为智能交通的关键节点,更因连接电网、用户设…

3dma渲染噪点成因排查及优化方案

有时候在用 3D Max 渲染完效果图,画面上总有密密麻麻的小颗粒,也就是常说的噪点,原本精致的模型和材质,一有噪点质感就掉了大半。其实多数时候,噪点问题都和渲染参数设置有关。那么出现噪点原因和解决方案有哪些&#…

【LeetCode】算法详解#15 ---环形链表II

1.题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评…

Kafka面试精讲 Day 18:磁盘IO与网络优化

【Kafka面试精讲 Day 18】磁盘IO与网络优化 在“Kafka面试精讲”系列的第18天,我们聚焦于磁盘IO与网络优化。作为支撑百万级吞吐量的分布式消息系统,Kafka的高性能不仅依赖于优秀的架构设计,更离不开对底层资源——尤其是磁盘和网络——的极…

ActiveMQ RocketMQ RabbitMQ Kafka选型及应用场景

许多时候我们都将Kafka拿来跟常用的几个消息队列作比较,将 Kafka 加入对比使得选型更加全面和实际。但请注意Kafka并非完全适用消息中间件的所有场景。这四款消息中间件定位不同,选择取决于你的具体场景。消息队列选型核心定位一句话总结RabbitMQ&#x…

STM32初始化串口重定向后printf调试信息不输出的问题

STM32初始化串口重定向后调试信息不输出的问题 Author:明月清了个风Date: 2025/9/9PS:开发stm32F745的过程中发现printf有时候不打印信息,单独调试确定了串口初始化和重定向正确,但是在系统整体调试的时候虽然正确运行…