Android无菜单键,如何触发onCreateOptionsMenu(Menu menu)
文章目录
- 小结
- 问题及解决
- 无法触发onCreateOptionsMenu(Menu menu)
- 修改配置文件解决
- 使用一个按钮来触发
- 其它办法
- 参考
小结
现在的Android有三个键: 任务键,Home键,返回键,也就是没有菜单键了,那么如何如何触发onCreateOptionsMenu(Menu menu)这个方法呢?测试了两种办法来触发这个onCreateOptionsMenu(Menu menu)方法,以达到显示菜单的效果。
问题及解决
无法触发onCreateOptionsMenu(Menu menu)
如果没有正确设置,是不会触发onCreateOptionsMenu(Menu menu)这个方法,也就是菜单无法触发显示不出来。
修改配置文件解决
参考CSDN: Android Studio 没有 gradle.properties 文件,需要在工程根目录下创建gradle.properties这个文件,内容如下:
android.useAndroidX=true
android.enableJetifier=true
参考关于在Fragment中设置Menu无效问题,在AndroidManifest.xml里添加android:theme="@style/ThemeOverlay.AppCompat.ActionBar"这行,以激活ActionBar的使用。
AndroidManifest.xml的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="example.menu"android:versionCode="1"android:versionName="1.0"android:theme="@style/ThemeOverlay.AppCompat.ActionBar"><application android:icon="@drawable/icon" android:label="@string/app_name"><activity android:name=".MenuTest"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>
</manifest>
dependencies是这样设置的:
dependencies {compile fileTree(dir: 'libs', include: '*.jar')//implementation 'androidx.appcompat:appcompat:1.0.0'//implementation 'android.support.v7.widget'//compile 'com.android.support:appcompat-v7:21.0.+'implementation 'com.android.support:appcompat-v7:29.0.+'
}
碰到以下问题:
uses-sdk:minSdkVersion 1 cannot be smaller than version 14 declared in library [androidx.appcompat:appcompat:1.0.0] C:\Users\LENOVO\.gradle\caches\transforms-3\9bee862a3eadd8338cd2918c9dad0196\transformed\appcompat-1.0.0\AndroidManifest.xml as the library might be using APIs not available in 1 Suggestion: use a compatible library with a minSdk of at most 1, or increase this project's minSdk version to at least 14, or use tools:overrideLibrary="androidx.appcompat" to force usage (may lead to runtime failures)
参考Android: App Manifest Overview 和 Stackoverlfow: Manifest merger failed : uses-sdk:minSdkVersion 1 cannot be smaller than version 14 declared in library
在build.gradle里添加
defaultConfig {
// other config options...minSdkVersion 14}
添加了以下的包引用:
import androidx.appcompat.widget.Toolbar;
import androidx.appcompat.app.AppCompatActivity;
参考Stackoverflow: You need to use a Theme.AppCompat theme (or descendant) with this activity,注意:
MenuTest 是继承自Activity,而不是AppCompatActivity或者ActionBarActivity .
public class MenuTest extends Activity
//public class MenuTest extends AppCompatActivity
最后的效果,点以下红框中三个点的地方,可以触发菜单。

触发菜单如下红框所示:

使用一个按钮来触发
参考Stackoverflow: Handling the missing MENU button in new versions of Android (3.x and up)
和
Android: Progamatically Open and Close an Activity’s Option Menu
在界面中添加一个按钮Pop Up Menu,可以在按钮事件中添加 openOptionsMenu();这个方法来触发菜单的。在``方法中添加以下监听器:
Button button = (Button) findViewById(R.id.button_send);button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {// Do something in response to button clickopenOptionsMenu();}});
点以下红框中的按钮,可以触发菜单。

点以上的按钮也是可以触发菜单的,效果跟先前Actionbar触发菜单是一样的。
最后,整个的build.gradle文件内容如下:
buildscript {repositories {google()mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:4.2.0'}
}
apply plugin: 'android'dependencies {compile fileTree(dir: 'libs', include: '*.jar')//implementation 'androidx.appcompat:appcompat:1.0.0'//implementation 'android.support.v7.widget'//compile 'com.android.support:appcompat-v7:21.0.+'implementation 'com.android.support:appcompat-v7:29.0.+'}allprojects {repositories {google()//jcenter()}}android {compileSdk 29buildToolsVersion '29.0.0'defaultConfig {
// other config options...minSdkVersion 14}sourceSets {main {manifest.srcFile 'AndroidManifest.xml'java.srcDirs = ['src']resources.srcDirs = ['src']aidl.srcDirs = ['src']renderscript.srcDirs = ['src']res.srcDirs = ['res']assets.srcDirs = ['assets']}// Move the tests to tests/java, tests/res, etc...//instrumentTest.setRoot('tests')// Move the build types to build-types/<type>// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...// This moves them out of them default location under src/<type>/... which would// conflict with src/ being used by the main source set.// Adding new build types or product flavors should be accompanied// by a similar customization.debug.setRoot('build-types/debug')release.setRoot('build-types/release')}
}
整个的源代码如下:
package example.menu;import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.MenuItem.OnMenuItemClickListener;
import android.widget.EditText;
import android.widget.Toast;import android.app.Fragment;
//import androidx.fragment.app.Fragment;
//import android.support.v7.widget.Toolbar;
//import androidx.appcompat.app.AppCompatActivity;
//import androidx.appcompat.app.AppCompatActivity;
//import androidx.appcompat.widget.Toolbar;import androidx.appcompat.widget.Toolbar;
import androidx.appcompat.app.AppCompatActivity;
//import android.support.v7.app.ActionBarActivity;
//import android.support.v7.app.AppCompatActivity;import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;public class MenuTest extends Activity
//public class MenuTest extends AppCompatActivity
{final int FONT_10 = 0x111;final int FONT_12 = 0x112;final int FONT_14 = 0x113;final int FONT_16 = 0x114;final int FONT_18 = 0x115;final int PLAIN_ITEM = 0x11b;final int FONT_RED = 0x116;final int FONT_BLUE = 0x117;final int FONT_GREEN = 0x118;private EditText edit;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);edit = (EditText) findViewById(R.id.txt);// Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
// setSupportActionBar(toolbar);//setHasOptionsMenu(true);
// Toolbar toolbar = findViewById(R.id.toolbar);
// toolbar.inflateMenu(R.menu.menu_main);//setHasOptionsMenu(true);//call it from onCreate(); or onViewCreated();//Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);//android.widget.Toolbar myToolbar = (android.widget.Toolbar) findViewById(R.id.toolbar);//setSupportActionBar(myToolbar);//setSupportActionBar(myToolbar);//((MainActivity) getActivity()).setSupportActionBar(myToolbar);Button button = (Button) findViewById(R.id.button_send);button.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {// Do something in response to button clickopenOptionsMenu();}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu){SubMenu fontMenu = menu.addSubMenu("Font Size");fontMenu.setIcon(R.drawable.font);fontMenu.setHeaderIcon(R.drawable.font);fontMenu.setHeaderTitle("Select font size");fontMenu.add(0, FONT_10, 0, "10 font size");fontMenu.add(0, FONT_12, 0, "12 font size");fontMenu.add(0, FONT_14, 0, "14 font size");fontMenu.add(0, FONT_16, 0, "16 font size");fontMenu.add(0, FONT_18, 0, "18 font size");menu.add(0, PLAIN_ITEM, 0, "Normal Menu Selection (Toast)");SubMenu colorMenu = menu.addSubMenu("Text Color");colorMenu.setIcon(R.drawable.color);colorMenu.setHeaderIcon(R.drawable.color);colorMenu.setHeaderTitle("Select Text Color");colorMenu.add(0, FONT_RED, 0, "Red");colorMenu.add(0, FONT_GREEN, 0, "Green");colorMenu.add(0, FONT_BLUE, 0, "Blue");// Inflate the menu; this adds items to the action bar if it is present.//getMenuInflater().inflate(R.menu.job_status_option_menu, menu);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem mi){switch (mi.getItemId()){case FONT_10:edit.setTextSize(10 * 2);break;case FONT_12:edit.setTextSize(12 * 2);break;case FONT_14:edit.setTextSize(14 * 2);break;case FONT_16:edit.setTextSize(16 * 2);break;case FONT_18:edit.setTextSize(18 * 2);break;case FONT_RED:edit.setTextColor(Color.RED);break;case FONT_GREEN:edit.setTextColor(Color.GREEN);break;case FONT_BLUE:edit.setTextColor(Color.BLUE);break;case PLAIN_ITEM:Toast toast = Toast.makeText(MenuTest.this, "This is a toast message!" , Toast.LENGTH_SHORT);toast.show();break;}return true;}}
main.xml的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent">
<EditText android:id="@+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="For Test Purpose! "android:editable="false"/><Button xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/button_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Pop Up Menu"android:onClick="popUpMenu" />
</LinearLayout>
其它办法
参考Android: Set up the app bar
可以使用setSupportActionBar(myToolbar);的Toolbar来触发onCreateOptionsMenu(Menu menu)这个方法,这个没试过,不清楚效果怎么样。
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_my);Toolbar myToolbar = (Toolbar) findViewById(R.id.my_toolbar);setSupportActionBar(myToolbar);
}
参考
CSDN: Android Studio 没有 gradle.properties 文件
CSDN: onCreateOptionsMenu和onPrepareOptionsMenu用法
关于在Fragment中设置Menu无效问题
CSDN: 关于 fragment重写onCreateOptionsMenu不执行问题
Stackoverflow: Handling the missing MENU button in new versions of Android (3.x and up)
Stackoverlfow: Manifest merger failed : uses-sdk:minSdkVersion 1 cannot be smaller than version 14 declared in library
Android: Progamatically Open and Close an Activity’s Option Menu
Android: App Manifest Overview
Android: Set up the app bar
Android studio: cannot find symbol variable toolbar
Stackoverflow: Error “package android.support.v7.app does not exist”
Stackoverflow: Can’t use android.support.v7.widget.Toolbar with android.useAndroidX=true
Stackoverflow: setsupportactionbar() throws error
Stackoverflow: Android error: cannot find symbol class ActionBarActivity
Stackoverflow: You need to use a Theme.AppCompat theme (or descendant) with this activity
相关文章:
Android无菜单键,如何触发onCreateOptionsMenu(Menu menu)
文章目录小结问题及解决无法触发onCreateOptionsMenu(Menu menu)修改配置文件解决使用一个按钮来触发其它办法参考小结 现在的Android有三个键: 任务键,Home键,返回键,也就是没有菜单键了,那么如何如何触发onCreateOp…...
“黑洞”竟是外星人的量子计算机?
宇宙中的黑洞可以用作终极量子计算机,我们可以从中探索它们的特征。(图片来源:网络)我们完全有理由怀疑生命在我们的宇宙中很常见,但是为什么我们从未发现过其他生命存在的迹象?这个问题几乎自现代天文学诞…...
计算机网络入门
一,计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化,网络化和信息化,它是一个以网络为核心的信息时代。有三类大家很熟悉的网络,即电信网络,有线电视网络和计算机网络。按照最初的服务分工,…...
网络安全-内网DNS劫持-ettercap
网络安全-内网DNS劫持-ettercap 前言 一,我也是初学者记录的笔记 二,可能有错误的地方,请谨慎 三,欢迎各路大神指教 四,任何文章仅作为学习使用 五,学习网络安全知识请勿适用于违法行为 学习网络安全知识请…...
synchronized和Lock的区别
synchronized和lock的区别 synchronized和Lock,我已经通过源码级别的介绍过了,下面我们来总结下他们的区别 区别: 1.synchronized是关键字,Lock是接口,synchronized是JVM层实现,Lock是JDK中JUC包下的实现;…...
SpringBoot 指标监控 Actuator
Spring Boot Actuator为 Micrometer 提供了依赖管理和自动配置,Micrometer是一个支持 众多监控系统 的应用程序指标接口 该功能与:java\jdk\bin 下的 Jconsole 功能雷同 1、pom文件中引入依赖(使用的springboot是2.7.2) <dep…...
面试浅谈之十大排序算法
面试浅谈之十大排序算法 HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是面试浅谈系列,收录在专栏面试中 😜😜😜 本系列将记录一些阿呆个人整理的面试题 🏃&…...
LeetCode-1250. 检查「好数组」【数论,裴蜀定理】
LeetCode-1250. 检查「好数组」【数论,裴蜀定理】题目描述:解题思路一:裴蜀定理是:a*xb*y1。其中a,b是数组中的数,x,y是任意整数。如果a,b互质那么一定有解。问题即转换为寻找互质的数。解题思路二:简化代码…...
【Linux】NTP时间同步服务与NFS网络文件共享存储服务器(配置、测试)
一、NTP时间同步服务1、NTP介绍NTP服务器【Network Time Protocol(NTP)】是用来使计算机时间同步化的一种协议,它可以使计机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正&a…...
windows下php连接oracle安装oci8扩展报错(PHP Startup: Unable to load dynamic library ‘oci8_11g‘)
记录一下php7.29安装oci8的艰苦过程,简直就是唐僧西天取经历经九九八十一难。 使用的是phpstudy_pro安装的ph扩展wnmp环境下; 1 、安装oralce Instant Client 首先,安装oci8和pdo_oci扩展依赖的Oracle client。了解到需要连接的Oracle版…...
TensorRT的功能
TensorRT的功能 文章目录TensorRT的功能2.1. C and Python APIs2.2. The Programming Model2.2.2. The Runtime Phase2.3. Plugins2.4. Types and Precision2.5. Quantization2.6. Tensors and Data Formats2.7. Dynamic Shapes2.8. DLA2.9. Updating Weights2.10. trtexec本章…...
433MHz无线通信--模块RXB90
1、接收模块RXB90简介 两个数据输出是联通的。 2、自定义一个编码解码规则 组数据为“0x88 0x03 0xBD 0xB6”。 3、发射模块 如何使用示波器得到捕捉一个周期的图像? 通过date引脚连接示波器CH1,以及示波器探针的接地端接芯片的GND,分…...
Seata源码学习(三)-2PC核心源码解读
Seata源码分析-2PC核心源码解读 2PC提交源码流程 上节课我们分析到了GlobalTransactionalInterceptor全局事务拦截器,一旦执行拦截器,我们就会进入到其中的invoke方法,在这其中会做一些GlobalTransactional注解的判断,如果有注解…...
IO流概述
🏡个人主页 : 守夜人st 🚀系列专栏:Java …持续更新中敬请关注… 🙉博主简介:软件工程专业,在校学生,写博客是为了总结回顾一些所学知识点 目录IO流概述IO 流的分类总结流的四大类字…...
【node.js】node.js的安装和配置
文章目录前言下载和安装Path环境变量测试推荐插件总结前言 Node.js是一个在服务器端可以解析和执行JavaScript代码的运行环境,也可以说是一个运行时平台,仍然使用JavaScript作为开发语言,但是提供了一些功能性的API。 下载和安装 Node.js的官…...
Python优化算法—遗传算法
Python优化算法—遗传算法一、前言二、安装三、遗传算法3.1 自定义函数3.2 遗传算法进行整数规划3.3 遗传算法用于旅行商问题3.4 使用遗传算法进行曲线拟合一、前言 优化算法,尤其是启发式的仿生智能算法在最近很火,它适用于解决管理学,运筹…...
数据埋点(Data buried point)的应用价值剖析
一、什么是数据埋点?数据埋点指在应用中特定的流程中收集一些信息,用来跟踪应用使用的状况,后续用来进一步优化产品或是提供运营的数据支撑。比如访问数(Visits),访客数(Visitor),停…...
一文弄懂硬链接、软链接、复制的区别
复制 命令:cp file1 file2 作用:实现对file1的一个拷贝。 限制:可以跨分区,文件夹有效。 效果:修改file1,对file2无影响;修改file2,对file1无影响。删除file1,对file…...
界面组件Telerik ThemeBuilder R1 2023开创应用主题研发新方式!
Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET包含一个完…...
在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录
在FederatedScope 如何查看client/server之间的传递的参数大小(通讯量)? 对源码的探索记录 背景需求 想给自己的论文补一个通讯开销对比实验:需要计算出client和server之间传递的信息(例如,模型权重、embedding)总共…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
