当前位置: 首页 > news >正文

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有三个键&#xff1a; 任务键&#xff0c;Home键&#xff0c;返回键&#xff0c;也就是没有菜单键了&#xff0c;那么如何如何触发onCreateOp…...

“黑洞”竟是外星人的量子计算机?

宇宙中的黑洞可以用作终极量子计算机&#xff0c;我们可以从中探索它们的特征。&#xff08;图片来源&#xff1a;网络&#xff09;我们完全有理由怀疑生命在我们的宇宙中很常见&#xff0c;但是为什么我们从未发现过其他生命存在的迹象&#xff1f;这个问题几乎自现代天文学诞…...

计算机网络入门

一&#xff0c;计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化&#xff0c;网络化和信息化&#xff0c;它是一个以网络为核心的信息时代。有三类大家很熟悉的网络&#xff0c;即电信网络&#xff0c;有线电视网络和计算机网络。按照最初的服务分工&#xff0c;…...

网络安全-内网DNS劫持-ettercap

网络安全-内网DNS劫持-ettercap 前言 一&#xff0c;我也是初学者记录的笔记 二&#xff0c;可能有错误的地方&#xff0c;请谨慎 三&#xff0c;欢迎各路大神指教 四&#xff0c;任何文章仅作为学习使用 五&#xff0c;学习网络安全知识请勿适用于违法行为 学习网络安全知识请…...

synchronized和Lock的区别

synchronized和lock的区别 synchronized和Lock&#xff0c;我已经通过源码级别的介绍过了&#xff0c;下面我们来总结下他们的区别 区别&#xff1a; 1.synchronized是关键字,Lock是接口&#xff0c;synchronized是JVM层实现&#xff0c;Lock是JDK中JUC包下的实现&#xff1b;…...

SpringBoot 指标监控 Actuator

Spring Boot Actuator为 Micrometer 提供了依赖管理和自动配置&#xff0c;Micrometer是一个支持 众多监控系统 的应用程序指标接口 该功能与&#xff1a;java\jdk\bin 下的 Jconsole 功能雷同 1、pom文件中引入依赖&#xff08;使用的springboot是2.7.2&#xff09; <dep…...

面试浅谈之十大排序算法

面试浅谈之十大排序算法 HELLO&#xff0c;各位博友好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 这里是面试浅谈系列&#xff0c;收录在专栏面试中 &#x1f61c;&#x1f61c;&#x1f61c; 本系列将记录一些阿呆个人整理的面试题 &#x1f3c3;&…...

LeetCode-1250. 检查「好数组」【数论,裴蜀定理】

LeetCode-1250. 检查「好数组」【数论&#xff0c;裴蜀定理】题目描述&#xff1a;解题思路一&#xff1a;裴蜀定理是&#xff1a;a*xb*y1。其中a,b是数组中的数&#xff0c;x,y是任意整数。如果a,b互质那么一定有解。问题即转换为寻找互质的数。解题思路二&#xff1a;简化代码…...

【Linux】NTP时间同步服务与NFS网络文件共享存储服务器(配置、测试)

一、NTP时间同步服务1、NTP介绍NTP服务器【Network Time Protocol&#xff08;NTP&#xff09;】是用来使计算机时间同步化的一种协议&#xff0c;它可以使计机对其服务器或时钟源&#xff08;如石英钟&#xff0c;GPS等等)做同步化&#xff0c;它可以提供高精准度的时间校正&a…...

windows下php连接oracle安装oci8扩展报错(PHP Startup: Unable to load dynamic library ‘oci8_11g‘)

记录一下php7.29安装oci8的艰苦过程&#xff0c;简直就是唐僧西天取经历经九九八十一难。 使用的是phpstudy_pro安装的ph扩展wnmp环境下&#xff1b; 1 、安装oralce Instant Client 首先&#xff0c;安装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、发射模块 如何使用示波器得到捕捉一个周期的图像&#xff1f; 通过date引脚连接示波器CH1&#xff0c;以及示波器探针的接地端接芯片的GND&#xff0c;分…...

Seata源码学习(三)-2PC核心源码解读

Seata源码分析-2PC核心源码解读 2PC提交源码流程 上节课我们分析到了GlobalTransactionalInterceptor全局事务拦截器&#xff0c;一旦执行拦截器&#xff0c;我们就会进入到其中的invoke方法&#xff0c;在这其中会做一些GlobalTransactional注解的判断&#xff0c;如果有注解…...

IO流概述

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 目录IO流概述IO 流的分类总结流的四大类字…...

【node.js】node.js的安装和配置

文章目录前言下载和安装Path环境变量测试推荐插件总结前言 Node.js是一个在服务器端可以解析和执行JavaScript代码的运行环境&#xff0c;也可以说是一个运行时平台&#xff0c;仍然使用JavaScript作为开发语言&#xff0c;但是提供了一些功能性的API。 下载和安装 Node.js的官…...

Python优化算法—遗传算法

Python优化算法—遗传算法一、前言二、安装三、遗传算法3.1 自定义函数3.2 遗传算法进行整数规划3.3 遗传算法用于旅行商问题3.4 使用遗传算法进行曲线拟合一、前言 优化算法&#xff0c;尤其是启发式的仿生智能算法在最近很火&#xff0c;它适用于解决管理学&#xff0c;运筹…...

数据埋点(Data buried point)的应用价值剖析

一、什么是数据埋点&#xff1f;数据埋点指在应用中特定的流程中收集一些信息&#xff0c;用来跟踪应用使用的状况&#xff0c;后续用来进一步优化产品或是提供运营的数据支撑。比如访问数&#xff08;Visits&#xff09;&#xff0c;访客数(Visitor&#xff09;&#xff0c;停…...

一文弄懂硬链接、软链接、复制的区别

复制 命令&#xff1a;cp file1 file2 作用&#xff1a;实现对file1的一个拷贝。 限制&#xff1a;可以跨分区&#xff0c;文件夹有效。 效果&#xff1a;修改file1&#xff0c;对file2无影响&#xff1b;修改file2&#xff0c;对file1无影响。删除file1&#xff0c;对file…...

界面组件Telerik ThemeBuilder R1 2023开创应用主题研发新方式!

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库&#xff0c;加快开发速度。Telerik DevCraft提供最完整的工具箱&#xff0c;用于构建现代和面向未来的业务应用程序&#xff0c;目前提供UI for ASP.NET包含一个完…...

在FederatedScope 如何查看clientserver之间的传递的参数大小(通讯量)? 对源码的探索记录

在FederatedScope 如何查看client/server之间的传递的参数大小&#xff08;通讯量&#xff09;&#xff1f; 对源码的探索记录 背景需求 想给自己的论文补一个通讯开销对比实验&#xff1a;需要计算出client和server之间传递的信息(例如&#xff0c;模型权重、embedding)总共…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

《Docker》架构

文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器&#xff0c;docker&#xff0c;镜像&#xff0c;k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...