Android Studio 之 菜单 Menu

news2024/11/16 13:35:08

选项菜单 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 不显示 有图标就显示图标
    -->
    <item
        android:id="@+id/m1"
        android:title="选项1"
        app:showAsAction="always"/>
    <item
        android:id="@+id/m2"
        android:title="选项2"/>
    <item
        android:id="@+id/m3"
        android:title="选项3"/>
    <item
        android: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
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // 加载菜单资源
        getMenuInflater().inflate(R.menu.option,menu);
        return true;
    }

    // optionMenu 的选中方法
    @Override
    public 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
    @Override
    public 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">

    <item
        android:id="@+id/ctx1"
        android:title="上下文菜单item1" />
    <item
        android:id="@+id/ctx2"
        android:title="上下文菜单item2" />
    <item
        android:id="@+id/ctx3"
        android:title="上下文菜单item3" />
    <item
        android:id="@+id/ctx4"
        android:title="上下文菜单item4" />
    <item
        android:title="上下文菜单item5">
        <menu>
            <item
                android:id="@+id/z_ctx1"
                android:title="子菜单item1" />
            <item
                android:id="@+id/z_ctx2"
                android:title="子菜单item2" />
            <item
                android: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">

    <Button
        android: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
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        getMenuInflater().inflate(R.menu.context,menu);
    }

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

// 3.contextMenu 菜单项选项操作
    @Override
    public 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))时调用
       @Override
       public boolean onCreateActionMode(ActionMode mode, Menu menu) {
           Log.e("上下文操作模式","--创建--");
           getMenuInflater().inflate(R.menu.context,menu);
           return true;
       }

       // 准备:在创建方法后进行调用
       @Override
       public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
           Log.e("上下文操作模式","--准备--");
           return false;
       }

       // 菜单项被点击
       @Override
       public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
           /* 环境变量此时需要这样是因为这是一个内部类 ButtonActivity.this */
           Log.e("上下文操作模式","--点击--");
           Toast.makeText(ButtonActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
           return true;
       }

       // 结束:上下文操作模式结束时调用
       @Override
       public void onDestroyActionMode(ActionMode mode) {
           Log.e("上下文操作模式","--结束--");
       }
   };


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

<Button
        android: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() {
            @Override
            public boolean onLongClick(View v) {
                startActionMode(ac);
                return false;
            }
        });

弹出式菜单

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

添加一个按钮

 <Button
        android: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() {
            @Override
            public 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() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        Toast.makeText(ButtonActivity.this, item.getTitle(), Toast.LENGTH_SHORT).show();
                        return false;
                    }
                });
                // 显示菜单
                popupMenu.show();
            }
        });

 

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

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

相关文章

构建库函数雏形(以GPIO为例)

构建库函数雏形 进行外设结构体定义构建置位和复位函数进行库函数的自定义 step I&#xff1a; \textbf{step I&#xff1a;} step I&#xff1a; 对端口进行输出数据类型枚举 step II&#xff1a; \textbf{step II&#xff1a;} step II&#xff1a;对端口进行结构化描述 step…

k8s---helm

Helm是什么&#xff1f; 在没有helm之前。部署一个服务&#xff0c;需要deployment、service、ingress、挂在卷等等相关配置都需要人工来配置。 helm的作用就是通过打包的方式&#xff0c;把需要人工编写的配置集成在一起。是一键式的部署服务。类似于yum功能。 由官方提供的…

通过Android Logcat分析firebase崩溃

参考&#xff1a;UnityIL2CPP包Crash闪退利用Android Logcat还原符号表堆栈日志 - 简书 一、安装Android Logcat插件 1、新建空白unity工程&#xff0c;打开PackageManager窗口&#xff0c;菜单栏Window/PackageManager 2、PackageManager中安装Android Logcat日志工具 3、安…

Leetcode1143. 最长公共子序列

解题思路 求两个数组或者字符串的最长公共子序列问题&#xff0c;肯定是要用动态规划的。下面的题解并不难&#xff0c;你肯定能看懂。 首先&#xff0c;区分两个概念&#xff1a;子序列可以是不连续的&#xff1b;子数组&#xff08;子字符串&#xff09;需要是连续的&#xf…

威联通QNAP NAS结合cpolar内网穿透实现公网远程访问NAS中存储的文件

文章目录 推荐 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣…

蓝桥杯备赛 week 3 —— 高精度(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 高精度的概念 &#x1f4c1; 高精度加法和其模板 &#x1f4c1; 高精度减法和其模板 &#x1f4c1; 高精度乘法和其模板 &#x1f4c1; 高精度除法和其模板 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文…

WinSCP下载安装并实现远程SSH本地服务器上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

中仕教育:公务员省考和国考分别是什么时候?

1. 国考&#xff1a;国考时间基本上是固定的。报名时间一般在每年的10月中下旬&#xff0c;考试时间在11月下旬或12月上旬&#xff0c;面试时间在次年的2—3月。 2. 省考&#xff1a;大部分省份集中在3月至5月&#xff0c;部分省份还会有春秋两次考试。 省考和国考能都报名吗…

Obsidian笔记软件结合cpolar实现安卓移动端远程本地群晖WebDAV数据同步

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C#,最小生成树(MST)博鲁夫卡(Boruvka)算法的源代码

Otakar Boruvka 本文给出Boruvka算法的C#实现源代码。 Boruvka算法用于查找边加权图的最小生成树&#xff08;MST&#xff09;&#xff0c;它早于Prim和Kruskal的算法&#xff0c;但仍然可以被认为是两者的关联。 一、Boruvka算法的历史 1926年&#xff0c;奥塔卡博鲁夫卡&…

【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)

【Flink-1.17-教程】-【四】Flink DataStream API&#xff08;1&#xff09;源算子&#xff08;Source&#xff09; 1&#xff09;执行环境&#xff08;Execution Environment&#xff09;1.1.创建执行环境1.2.执行模式&#xff08;Execution Mode&#xff09;1.3.触发程序执行…

米贸搜|Meta广告中级水准:Facebook自动完成四项广告设置,改善投放成效!

广告投放中的机器学习预算自动分配版位自动分配受众自动分配创意灵活调整 一、广告投放中的机器学习 机器学习现已成为数字营销的基础&#xff0c;能够帮助我们面向想要触达的受众投放与之相关的广告。随着我们对如何使用机器学习的了解加深&#xff0c;我们对“如何创建广告…

眼镜清洗机是智商说吗?适合清洗眼镜的超声波清洗机推荐

随着现代生活步伐的加快&#xff0c;对于家居清洁的需求也日益增长。在这个背景下&#xff0c;超声波清洗机成为了现代家庭清洁的好帮手。有的朋友会认识超声波清洗机洗眼镜是智商税&#xff01;其实只要是用过超声波清洗机都知道这不是智商税&#xff0c;眼镜店老板每天用来清…

程序员如何保持身心健康

程序员要保持身心健康&#xff0c;可以注意以下几个方面&#xff1a; 饮食健康&#xff1a;保持均衡的饮食&#xff0c;多吃蔬菜水果&#xff0c;减少油腻和高热量食物的摄入。同时&#xff0c;适当饮水&#xff0c;避免因长时间坐着工作而导致的脱水。尽量不要吃街边摊、大排…

postgresql12表膨胀解决(不锁表)

查看所有数据库占用磁盘空间 SELECTpg_database.datname AS "数据库名称",pg_size_pretty(pg_database_size(pg_database.datname)) AS "磁盘占用空间" FROMpg_database;发现有个数据库占用空间过大 查询库中所有表占用空间 SELECTtable_name,pg_size_…

Chatgpt的崛起之路

Chatgpt的崛起之路 背景与发展历程背景发展历程 技术原理第一阶段&#xff1a;训练监督策略模型第二阶段&#xff1a;训练奖励模型第三阶段&#xff1a;采用强化学习来增强模型的能力。 国内使用情况及应用的领域面临的数据安全挑战与建议ChatGPT获取数据产生的问题数据泄露问题…

【学网攻】 第(8)节 -- 端口安全

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】 第(5)节 -- Cisco VTP的使用​​​​​​【学网攻】 第(6)节 -- 三层交换机实现VLAN间路由【学网攻…

docker 部署springboot项目

新建Dockerfile ## AdoptOpenJDK 停止发布 OpenJDK 二进制&#xff0c;而 Eclipse Temurin 是它的延伸&#xff0c;提供更好的稳定性 ## 感谢复旦核博士的建议&#xff01;灰子哥&#xff0c;牛皮&#xff01; FROM eclipse-temurin:8-jre## 将后端项目的 Jar 文件&#xff0c…

念念不忘智能编程,必有回响CodeArts Snap

开发者的碎碎念 之前在【我与ModelArts的故事】的文章里&#xff0c;分享过我学习新技术的经历&#xff0c;主要有&#xff1a; 自主学习&#xff0c;比如自学Python&#xff1b;借助华为云的产品边用边学。 在围着"编程学习"这座城池&#xff0c;外围来来回回转了…

springboot126疫情下图书馆管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的疫情下图书馆管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章…