文章目录

  • 小结
  • 问题及解决
    • 无法触发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

也可参考CSDN: 记录一下Popmenu的使用以及一些坑:自定义Popupmenu、Menu、Popupmenu添加icon

在界面中添加一个按钮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
CSDN: 记录一下Popmenu的使用以及一些坑:自定义Popupmenu、Menu、Popupmenu添加icon

Android无菜单键,如何触发onCreateOptionsMenu(Menu menu)相关推荐

  1. Android记录23-关于actionbar中overflow menu(溢出菜单)中的一些问题

    Android记录23-关于actionbar中overflow menu(溢出菜单)中的一些问题 前言 本篇博客记录一下小巫在使用actionbar的时候遇到关于溢出菜单的一些问题: 什么是Over ...

  2. Pro Android学习笔记(三三):Menu(4):Alternative菜单

    什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供 ...

  3. Android数据存储:数据库基础,在Android应用中使用数据库,附加Menu菜单选项的一些说明

    为什么**持久性数据很重要: 在计分器那个应用中,是将球队得分存储在变量里,当我们旋转应用时Activity被销毁,得分记录也没有了.将设备旋转为新的方向时,Activity被重现创建,得分又变成默认 ...

  4. 【Android开发】 在Activity中使用Menu

    在Activity中使用Menu Android给我们提供了一种方式,可以展示菜单的同时,还能不占用任何的屏幕空间 新建xml 首先在res目录下新建一个menu文件夹,右键res目录 - New - ...

  5. Android的Menu状态动态设置方法onPrepareOptionsMenu(Menu menu) (转载)

    覆盖onPrepareOptionsMenu(Menu menu)这个方法非常的好用,我们可以定义boolean值来进行判断,如果满足条件就可以把菜单栏动态设置成某些状态,比如是否可见,text值等等 ...

  6. android导入项目出现style错误,menu错误

    android导入项目出现style错误,menu错误 style //查看 res/values/styles.xml 下的报错点.<style name="AppBaseTheme ...

  7. android动态波浪效果图,【炫酷】Android 波浪式扭曲侧边栏,窗帘(Curtain Menu)效果...

    原标题:[炫酷]Android 波浪式扭曲侧边栏,窗帘(Curtain Menu)效果 来自:Android技术杂货铺(微信号:Tech-Android) 排版整编 作者:Android500 原文: ...

  8. [转]ExtJs4 笔记(13) Ext.menu.Menu 菜单、Ext.draw.Component 绘图、Ext.resizer.Resizer 大小变更...

    作者:李盼(Lipan) 出处:[Lipan] (http://www.cnblogs.com/lipan/) 版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其 ...

  9. Android无埋点的技术选型之路

    数极客是国内新一代用户行为分析平台,支持无埋点采集,前端代码埋点采集,后端代码埋点采集等多种混合数据采集方式,支持30多种数据可视化效果,是增长***必的备大数据分析工具,支持APP分析数据网站分析及 ...

最新文章

  1. 怎样让你的安全预算更具战略性?
  2. 90sec mysql_dedecms被挂马 /plus/90sec.php解决方法
  3. Spring 源码解析 -- SpringWeb过滤器Filter解析
  4. 诺宝机器人编程入门教程_(完整)VEX 机器人软件编程教程
  5. VS(Microsoft Visual Studio)C语言一个解决方案内部创建多个项目
  6. 基于matlab道路交通标志牌,基于MATLAB的道路交通标志识别
  7. Java获取WiFi ssid_如何在Flutter中获取当前连接的wifi的wifi名称(SSID)
  8. 使用stream流进行集合排序取最大值,根据集合中的bigdemal属性排序(正序反序)并取最大值
  9. 一份不悔的爱情 魔兽中那些我们追过的橙色武器_马立杰_新浪博客
  10. 使用百度网盘下载ed2k文件
  11. Leet code链表相关题目初探
  12. 程序员面试的奇葩问题
  13. php 在对象中递归 坑,PHP_PHP对象递归引用造成内存泄漏分析,通常来说,如果PHP对象存在递 - phpStudy...
  14. 听说RSI准的难以置信?
  15. cocos2dx中CCTableView乱位问题歪解
  16. mysql 多字段关键词模糊查询
  17. 数字孪生公路隧道,打造智慧交通闭环行车安全体系
  18. 计算机应用基础教学课三维目标,《计算机应用基础》项目教学课程教案.doc
  19. IOS开发之新浪微博OAuth2
  20. SXSSFWorkbook 转 InputStream

热门文章

  1. 11月NEO技术社区开发进展汇总
  2. Python中的字符串驻留机制
  3. python怎么循环终止_Python 循环终止语句的三种方法小结
  4. winserver修改计算机用户名,如何修改Windows系统的管理员账户名
  5. PGM 格式图像数据操作
  6. ms7522芯片 服务器内存条,IBM eX5架构X5服务器:创新MAX5内存技术
  7. 网页小游戏源码丨FC模拟器网页版源码
  8. 【论文精度】Subdivision-Based Mesh Convolution Networks
  9. MATLAB单点定位程序设计思路
  10. opencv学习(二十五)之开运算、闭运算、形态梯度、顶帽、黑帽