我们平时在开发过程中,为了灵活多变,除了使用静态的菜单,还有动态添加菜单的需求。今天要分享的功能如下:

  1. 在界面的右上角有个更多选项,点开后,有两个子菜单:关于和退出

  2. 点击“关于”,弹出一个对话框,显示一句话

  3. 点击“退出”,弹出一个对话框,用户点击“确定”,关闭整个页面;点击“取消”,不关闭页面

实现思路如下:

  1. 复写 onCreateOptionsMenu 方法,在该方法内调用Menu的add方法,动态添加菜单,并设置菜单的顺序和内容
  2. 复写 onOptionsItemSelected 方法,在该方法内处理菜单的点击事件
  3. 再单独提供两个方法,分别用于实现“关于”对话框和“退出对话框”的显示

源码如下:

1、主Activity

`import android.app.Activity;

import android.app.AlertDialog;

import android.content.DialogInterface;

import android.os.Bundle;

import android.util.Log;

import android.view.Menu;

import android.view.MenuItem;

import androidx.annotation.NonNull;

import com.example.memorydemo.R;

public class SimpleMenu extends Activity {

private static final String TAG = "SimpleMenu";

@Override

protected void onCreate(Bundle onSavedInstance) {

super.onCreate(onSavedInstance);

setContentView(R.layout.simple_menu);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 添加一个 id 为 0,顺序为 0 的“关于”菜单
menu.add(0, 0, 0, "About"); // 添加一个 id 为 1,顺序为 1 的“退出”菜单
menu.add(0, 1, 1, "Exit");
Log.i(TAG, "call onCreateOptionsMenu");
return true;
} @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
super.onOptionsItemSelected(item);
// 这里的 itemId 就是上面add方法的第二个参数
switch (item.getItemId()) {
case 0:
showDialog();
break; case 1:
showExitDialog();
break; default: }
return true;
} private void showDialog() {
new AlertDialog.Builder(this)
.setTitle("About")
.setMessage("This is just a demo.")
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
})
.show();
} private void showExitDialog() {
new AlertDialog.Builder(this)
.setTitle("Exit")
.setMessage("Are you sure to EXIT?")
.setPositiveButton("Sure", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
})
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { }
})
.show();
}

}`

2、简单的布局文件simple_menu.xml,把TextView 放屏幕中间:

`

<TextView
android:text="This is a simple menu demo."
android:layout_width="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:layout_height="wrap_content" android:id="@+id/textView5" android:layout_weight="1"/>

`

3、效果图如下:

这里有个“坑”要注意:

如果该Activity或整个应用使用了父主题为“Theme.AppCompat.Light.DarkActionBar”的主题,比如:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">

菜单不会显示!!!

【Android初级】如何动态添加菜单项(附源码+避坑)的更多相关文章

  1. Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)

    场景 Winform中实现ZedGraph中曲线右键显示为中文: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100115292 ...

  2. MFC 单文档中动态添加菜单项和响应菜单事件

    新建一个单文档程序 在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏 #define ID_N ...

  3. 转载—— android 瀑布流的实现详解,附源码

    介绍 参考自:https://github.com/dodola/android_waterfall,因为原来的代码封装不好,所以,我根据源码的思路,重新写了一遍,所以有了现在这个项目:https:/ ...

  4. Java:基于AOP的动态数据源切换(附源码)

    1 动态数据源的必要性 我们知道,物理服务机的CPU.内存.存储空间.连接数等资源都是有限的,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈.而在复杂的互联网业务场景下,系统流量日益膨 ...

  5. [BOT]自己动手实现android 饼状图,PieGraphView,附源码解析

    本文要介绍的是一个参照手机支付宝app里面记账本功能里的"饼状图"实现的控件.通常app中可能的数据展示控件有柱状图,折线图,饼状图等,如果需要一个包含多种View控件的库,那么 ...

  6. 福利!Python制作动态字符画(附源码)

    字符画,一种由字母.标点.汉字或其他字符组成的图画.简单的字符画是利用字符的形状代替图画的线条来构成简单的人物.事物等形象,它一般由人工制作而成:复杂的字符画通常利用占用不同数量像素的字符代替图画上不 ...

  7. Redrain 通用菜单控件使用方法和说明(附源码和demo)

    转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42889709 大概半年前我写过博客说明怎么改造duilib的原代Menu ...

  8. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  9. ArcGIS紧凑型切片读取与应用2-webgis动态加载紧凑型切片(附源码)

    1.前言 上篇主要讲了一下紧凑型切片的的解析逻辑,这一篇主要讲一下使用openlayers动态加载紧凑型切片的web地图服务. 2.代码实现 上篇已经可以通过切片的x.y.z得对应的切片图片,现在使用 ...

随机推荐

  1. LightningChart解决方案:XY和3D图表(Polymer Char GPC-IR&#174;-工程案例)

    LightningChart解决方案:XY和3D图表(Polymer Char GPC-IR-工程案例) 所在行业:石化公司成立时间:1992年LightningChart解决方案:XY和3D图表 P ...

  2. 探究 position-sticky 失效问题

    CSS 的 position 值中,有一个非常有用的值 -- position: sticky,通常会被用于各种吸顶,吸底,吸边的效果中. 如果你对 sticky 还不太熟悉,可以先看看我的这篇文章: ...

  3. Redis入门指导

    前言 本文提供全网最完整的Redis入门指导教程,下面我们从下载Redis安装包开始,一步一步的学习使用. 下载Redis 官网提供的Redis安装包是服务于Linux的,而我们需要在Window下使 ...

  4. winform关闭登录窗体打开主窗体的方法

    实际使用 Program.cs代码 //声明一个线程 private static System.Threading.Mutex mutex; /// <summary> /// 应用程序 ...

  5. 读取平台管理员xlsx文件

    package com.cn.peitest.excel; import java.io.File; import java.io.FileInputStream; import java.io.Fi ...

  6. Git全栈开发者使用指南

    一.Git基础 1.Git简介 Git是一种分布式版本控制系统,由Linux之父Linus开发. 所谓分布式版本管理系统,就是在每一台机器上都有一个完整的仓库. 2.Git官网 Git官网:git 在 ...

  7. centos7下mysql安装与卸载

    彻底卸载mysql 一.chak 是否有安装mysql a)      rpm -qa | grep -i mysql // 查看命令1 b)      yum list install mysql* ...

  8. 【转载】VUE的背景图引入

    我现在的项目要将登录页面的背景引一图片做为背景图片,按原jsp中的写法,发现无法找到背景图片,最后从网上查资料,采用上面的写法,成功显示出背景图片,参考网址 https://blog.csdn.net ...

  9. 解决MySQL Workbench导出低版本MySQL时报错Unknown table ‘column_statistics’ in information_schema的问题

    在使用高版本MySQL Workbench或MySQL 8.0+版本提供的mysqldump.exe(实际高版本的MySQL Workbench使用的也是高版本的mysqldump.exe)来导出低于 ...

  10. Spark算子使用

    一.spark的算子分类 转换算子和行动算子 转换算子:在使用的时候,spark是不会真正执行,直到需要行动算子之后才会执行.在spark中每一个算子在计算之后就会产生一个新的RDD. 二.在编写sp ...