Android入门第34天-Android的Menu组件使用大全

news2025/8/11 18:54:52

简介

Android有不同的菜单:

  • 系统菜单
  • 弹出菜单(可自定义样式)
  • Context Menu;
  • 子菜单;

菜单的使用和我们前面说的AlertDialog很像。它可以支持自定义样式、也可以对菜单的点击事件进行绑定。

Android里有几个MainActivity事件可以覆盖,其中有以下几个事件就是用于处理Menu的。

  • onCreateOptionsMenu(Menu menu),在这个方法里如果你使用menu.add就可以实现在Android的手机里右上角的...图标点击出现系统菜单的效果;

  • onOptionsItemSelected(MenuItem item),这个方法里可以进行每个系统菜单项点击的处理事件;

  • onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) ,这个是用来创建ContextMenu的,即这个菜单可以绑定在一个组件上,比如说按一下一个组件,对于这个组件的菜单就会被弹出。但是它要启作用必须在程序运行开始时调用一下Activity里的自带方法:registerForContextMenu(View view);来指定,ContextMenu绑定在哪个组件的身上;

  • onContextItemSelected(MenuItem item),相应的对于ContextMenu的每一个item的点击处理方法,用户可以自定义和覆盖里面的逻辑;

课程目标

  1. 做一个可以改变屏幕中间TextView字体颜色的系统菜单;
  2. 点一下按钮弹出一个PopMenu;
  3. 对于一个TextView绑定一个ContextMenu;

代码

前端代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/viewContext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:text="长按出context menu"
        android:textSize="18sp" />
 
    <TextView
        android:id="@+id/textColor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="选择菜单改变颜色"
        android:textSize="18sp" />
 
 
    <Button
        android:id="@+id/btnShowMenu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textColor"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:text="展示弹出菜单" />
 
 
</RelativeLayout>

 系统菜单

前端代码

不需要

后端代码

MainActivity.java

系统菜单涉及到两个方法的覆盖,因此只要在这两个方法把系统菜单设上,同时对系统菜单的“选择”事件做出自定义即可,在此我们通过系统菜单改变屏幕中一行字的字体颜色

//1.定义不同颜色的菜单项的标识:
  private final int RED = 101;
  private final int GREEN = 102;
  private final int BLUE = 103;
  private final int YELLOW = 104;
  private final int GRAY = 105;
  private final int CYAN = 106;
  private final int BLACK = 107;
@Override
 public boolean onCreateOptionsMenu(Menu menu) {
     // Inflate the menu; this adds items to the action bar if it is present.
     menu.add(1, RED, 4, "红色");
     menu.add(1, GREEN, 2, "绿色");
     menu.add(1, BLUE, 3, "蓝色");
     menu.add(1, YELLOW, 1, "黄色");
     menu.add(1, GRAY, 5, "灰色");
     menu.add(1, CYAN, 6, "蓝绿色");
     menu.add(1, BLACK, 7, "黑色");
     return true;
 }
 
 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
     int id = item.getItemId();
     switch (id) {
         case RED:
             textColor.setTextColor(Color.RED);
             break;
         case GREEN:
             textColor.setTextColor(Color.GREEN);
             break;
         case BLUE:
             textColor.setTextColor(Color.BLUE);
             break;
         case YELLOW:
             textColor.setTextColor(Color.YELLOW);
             break;
         case GRAY:
             textColor.setTextColor(Color.GRAY);
             break;
         case CYAN:
             textColor.setTextColor(Color.CYAN);
             break;
         case BLACK:
             textColor.setTextColor(Color.BLACK);
             break;
     }
     return super.onOptionsItemSelected(item);
 }

弹出菜单

前端代码

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/mcat" android:title="一只喵" />
    <item android:id="@+id/mdog" android:title="一只汪" />
</menu>

 后端代码

   btnShowMenu.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            PopupMenu popup = new PopupMenu(MainActivity.this,btnShowMenu);
            popup.getMenuInflater().inflate(R.menu.pop_menu, popup.getMenu());
            popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()){
                        case R.id.mcat:
                            Toast.makeText(MainActivity.this,"你轻拍了一下喵",
                                    Toast.LENGTH_SHORT).show();
                            break;
                        case R.id.mdog:
                            Toast.makeText(MainActivity.this,"你轻拍了一下汪",
                                    Toast.LENGTH_SHORT).show();
                            break;
                    }
                    return true;
                }
            });
            popup.show();
        }
    });
}

ContextMenu

前端

context_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="none">
        <item android:id="@+id/blue" android:title="@string/font_blue"/>
        <item android:id="@+id/green" android:title="@string/font_green"/>
        <item android:id="@+id/red" android:title="@string/font_red"/>
    </group>
</menu>

后端

我们可以看到这个ContextMenu是绑定在一个TextView上的。

viewContext=(TextView)findViewById(R.id.viewContext);
registerForContextMenu(viewContext);
 
   //重写上下文菜单的创建方法
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenu.ContextMenuInfo menuInfo) {
        MenuInflater inflator = new MenuInflater(this);
        inflator.inflate(R.menu.context_menu, menu);
        super.onCreateContextMenu(menu, v, menuInfo);
    }
    //上下文菜单被点击是触发该方法
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.blue:
                viewContext.setTextColor(Color.BLUE);
                break;
            case R.id.green:
                viewContext.setTextColor(Color.GREEN);
                break;
            case R.id.red:
                viewContext.setTextColor(Color.RED);
                break;
        }
        return true;
    }
}

所以,请各位动一下手自己试试吧。

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

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

相关文章

《嵌入式 - 深入剖析STM32》STM32 启动流程详解(GCC)

开发环境&#xff1a; 处理器&#xff1a;STM32F103 GCC&#xff1a;10.3.1 对于我们常用的桌面操作系统而言&#xff0c;我们在开发应用时&#xff0c;并不关心系统的初始化&#xff0c;绝大多数应用程序是在操作系统运行后才开始运行的&#xff0c;操作系统已经提供了一个合…

vxe-table 表格尾部小计列项再合计展示

公式&#xff1a;店员奖金item1item3item5item7 this.dyjj全局变量 this.tableDat 全局数组 1.求出尾部小计这一行的数据 columns.map((column, columnIndex) > { var aa XEUtils.sum(data, column.property) this.tableDat.push(aa) if (columnIndex 0) { return ‘小计…

USB TO I2C/SPI(上海同旺电子)调试器调试ADT7420--step3

所需设备&#xff1a; 1、USB TO I2C/SPI(上海同旺电子)专业版 或 升级版 2、ADT7420 0.25C精度、16位数字I2C温度传感器; USB TO I2C/SPI(上海同旺电子)专业版 或 升级版&#xff0c;既支持I2C的标准指令&#xff0c;又支持I2C的复合指令&#xff0c;市面上大部分I2C调试器…

【JSP】Page指令和九大内置对象

JSPJSP中的Page指令关于Page指令常用的属性1. <%page session"true|false" %>2. <%page contentType"text/json" pageEncoding"UTF-8" %>3. <%page import"java.util.Collection,java.sql.Connection"%>4. <%pag…

ImmunoChemistry艾美捷绿色活/死染色解决方案

ImmunoChemistry艾美捷绿色活/死染色是一种活细胞不渗透、绿色荧光发射DNA染料&#xff0c;用于生存能力、细胞凋亡和坏死研究以及固定细胞核染色。本产品与坏死或渗透化细胞的dsDNA/细胞核结合&#xff0c;可与活细胞染料结合使用&#xff0c;用于活/死鉴别。使用流式细胞仪或…

Redis基础命令(String类型)Value为JSON

目录 String类型&#xff08;存储的值为JSON形式&#xff09; 问题&#xff1a; 解决办法&#xff1a; 示例&#xff1a; 实际操作&#xff1a; 总结&#xff1a; String类型&#xff08;存储的值为JSON形式&#xff09; 问题&#xff1a; Redis没有类似MySql中的表的概…

iText7高级教程之html2pdf——5.自定义标签和CSS应用

在本章中&#xff0c;我们将更改pdfHTML插件的两个最重要的内部机制。 我们将覆盖将HTML标签与iText对象匹配的默认功能&#xff0c;更具体地说是DefaultTagWorkerFactory机制&#xff0c;以及我们将覆盖将CSS样式与iText样式相匹配的默认功能&#xff0c;更具体地说是Default…

【Python百日进阶-WEB开发-冲進Flask】Day183 - Flask数据库ORM基础、增加

文章目录一、day03项目环境和结构搭建1.1 flask-script1.1.1 flask-script是干什么的&#xff1f;1.1.2 flask-script安装1.1.3 flask-script的使用1.1.3.1 创建Manager实例1.1.3.2 初始化实例出错与解决1.1.4 终端启动1.1.4.1 查看runserver参数1.1.5 自定义添加manager命令1.…

ARM-A架构入门基础(二)异常处理

14天学习训练营导师课程&#xff1a;周贺贺《ARMv8/ARMv9架构-快速入门》 1. 异常处理种类 1.1 中断 在ARM中&#xff0c;FIQ的优先级要高于IRQ&#xff0c;在SOC内部会有一个中断控制器负责中断优先级调度&#xff0c;然后发送中断信号给处理器。中断属于异步模式的异常。 …

Python定时打开世界杯直播,还有小姐姐语音提醒哦~不错过每一场世界杯比赛

前言 卡塔尔世界杯今晚0点就要开幕了&#xff0c;为了防止大家沉迷工作&#xff0c;忘记看球&#xff0c;小编用50行Python代码写了一个定时提醒你看球的小程序&#xff0c;还有小姐姐语音提醒哟~&#x1f387; &#xff08;文末送读者福利&#xff09; 1、代码说明 获取上…

Redmine 插件 实现富文本编辑,可插入表格和

基本介绍 Redmine 插件将“所见即所得"的UEditor富文本编辑器完美移植到了Redmine。UEditor具有界面美观、功能丰富、注重用户体验的特点&#xff0c;使用方法比CKeditor更为简便。 该插件在redmine现有的文本编辑模式上添加WYSIWYG所见即所得编辑功能。 Redmine UEditor主…

功能测试如何进阶自动化测试?5个步骤带你成功进阶...

手动测试人员应该权衡测试自动化相对于手动测试的好处&#xff0c;并且即可开始行动。下面我介绍一下从手动测试到自动化测试转换的5步指南。 步骤1: 查找合适的自动化测试用例 测试自动化在重复测试中发挥着极其重要的作用。可以在下表中找到最适合自动化的测试类型列表。 测…

【学习笔记20】JavaScript数据类型之间的区别

一、数据类型 基本数据类型复杂数据类型 (function; object; array)二、存储的区别 基本数据类型: 存储在栈内存中, 变量内部就是实际的值引用数据类型: 变量存储在栈内存中, 变量内部存储的是指向堆内存的地址(对象实际的值, 存储在堆内存中)三、赋值的区别 1. 基本数据类型: …

Linux零基础从入门到精通,必学的55个指令合集【下篇】

Linux学习笔记 资料下载&#xff1a; 链接: https://pan.baidu.com/s/1UvwkJaEJO7W3sU5qkCgKzA?pwdfe2f提取码: fe2f 本篇文章主要适用0基础的读者&#xff0c;内容会比较通俗易懂&#xff0c;也会有详细的图解教程&#xff0c;以及运行后的返回结果。我本人在系统性的学习…

Rsync已过时?替代文件同步方式了解一下

随着企业结构分散化的不断扩大&#xff0c;企业内部和企业间的信息互动更加频繁。越来越多的企业要求内部各种业务数据在服务器、数据中心甚至云上能够有实时的同步留存。所以&#xff0c;企业需要文件同步软件&#xff0c;通过在两个或更多设备之间同步数据并自动更新更改来确…

零时科技 || 分布式资本创始人4200万美金资产被盗分析及追踪工作

事件背景 2022年11月23日&#xff0c;分布式资本创始人沈波发推文称&#xff0c;价值4200万美元的个人钱包资产被盗&#xff0c;其中包含 3800 万枚 USDC和1606 枚 ETH&#xff0c;在纽约时间 11 月 10 日凌晨被盗。被盗资产为个人资金&#xff0c;与分布式相关基金无关。目前…

【学习笔记16】JavaScript函数封装习题

笔记初发 1、书写一个函数, 求任意两个数字的和, 把结果以弹窗的形式展示 书写一个函数需要参数吗?            -->需要需要几个参数?         —>两个函数要做什么?         -->求和然后弹窗的形式展示    -->alert(弹窗展示的值…

Area of a circle

In geometry, the area enclosed by a circle of radius r is πr2. Here the Greek letter π represents the constant ratio of the circumference of any circle to its diameter, approximately equal to 3.14159. One method of deriving this formula, which originate…

【矩阵论】4. 矩阵运算——张量积

4.2 张量积 4.2.1 定义 设A(aij)mn,B(bij)pq,则称如下分块矩阵(a11Ba12B⋯a1nBa21Ba22B⋯a2nB⋮⋮⋱⋮an1Ban2⋯ann)为A与B的张量积记作A⊗B(aijB)mpnq\begin{aligned} &设A(a_{ij})_{m\times n},B(b_{ij})_{p\times q},则称如下分块矩阵\left( \begin{matrix} a_{11}B&am…

【Dense Res2net:两个非局部注意模型:IVIF】

Res2Fusion: Infrared and Visible Image Fusion Based on Dense Res2net and Double Nonlocal Attention Models &#xff08;Res2Fusion: 基于密集Res2net和双非局部注意模型的红外和可见光图像融合&#xff09; 红外和可见光图像融合旨在生成具有出色场景表示和更好视觉感…