如何在Android的“选项”菜单上更改MenuItem?

我的Activity上有一个选项菜单,带有mymenu.xml“开始”。 选择此3000128611611048489985后,我想更改菜单,使其包含MenuItem“停止”。 最后,当选择“停止”时,我想改回“开始”。

这是我的部分代码无法正常工作。 我在mymenu.xml中同时列出了“开始”和“停止”,创建菜单时可能应该删除“停止”:

public class MyActivity extends Activity {

private boolean isStarted = false;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

MenuInflater inflater = getMenuInflater();

menu.removeItem(R.id.stop);

inflater.inflate(R.menu.mymenu, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case R.id.start:

isStarted = true;

return true;

case R.id.stop:

isStarted = false;

return true;

default:

return super.onOptionsItemSelected(item);

}

}

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

if(isStarted) {

menu.removeItem(R.id.start);

menu.add(R.id.stop);

} else {

menu.removeItem(R.id.stop);

menu.add(R.id.start);

}

return true;

}

}

6个解决方案

96 votes

对于这种类型的操作,我通常选择不更改菜单项,而只隐藏不需要的菜单项:

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

super.onPrepareOptionsMenu(menu);

menu.findItem(R.id.start).setVisible(!isStarted);

menu.findItem(R.id.stop).setVisible(isStarted);

return true;

}

Flygenring answered 2020-08-07T00:15:15Z

20 votes

Flygenring的答案是正确的,但是menu.findItem()太慢了,在onPrepareOptionsMenu(Menu menu)中调用它会产生不良的用户体验。 最好在创建菜单时获取一次MenuItem对象,然后每次在屏幕上出现菜单时都调用setVisible:

MenuItem mDynamicMenuItem;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

// Get dynamic menu item

mDynamicMenuItem = menu.findItem(R.id.menu_item);

return true;

}

// Prepare the Screen's standard options menu to be displayed. This is called right

// before the menu is shown, every time it is shown. You can use this method to

// efficiently enable/disable items or otherwise dynamically modify the contents.

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

super.onPrepareOptionsMenu(menu);

// Here is just a good place to update item

mDynamicMenuItem.setVisible(isVisible);

return true;

}

i.shadrin answered 2020-08-07T00:15:35Z

6 votes

完成更改后,可能需要调用super.onPrepareOptionsMenu。 从文档:

派生类应始终调用 直到基层 实施。

Cheryl Simon answered 2020-08-07T00:16:00Z

3 votes

我找到了解决方案。 调用false时,基本上就是删除MenuItem,因此也删除了引用。 使用此代码有效。

private boolean isStarted = false;

@Override

public boolean onOptionsItemSelected(MenuItem item) {

switch (item.getItemId()) {

case 1:

isStarted = true;

return true;

case 0:

isStarted = false;

return true;

default:

return super.onOptionsItemSelected(item);

}

}

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

if(isStarted) {

menu.removeItem(1);

menu.add(0, 0, 0, "Stop");

} else {

menu.removeItem(0);

menu.add(0, 1, 0, "Start");

}

return super.onPrepareOptionsMenu(menu);

}

您必须再次创建MenuItem。 那也是false标签的原因。 实际上,当您通过代码创建Menu时,您不需要MenuInflater,因此也不需要任何菜单XML文件。

Octavian Damiean answered 2020-08-07T00:16:24Z

1 votes

感谢您提供这篇文章中的信息,因为它解决了我菜单中错误标签的问题。 我确实需要对其进行一些修改,并使其最终代码可以正常工作,如下所示,希望它可以节省其他人的时间和挫败感。 它的解决方案稍有不同,但我所做的主要更改是将.setVisible更改为True或False,除了i.shadrins解决方案最适合我的需求。

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

super.onPrepareOptionsMenu(menu);

if(loggedIn)

{

logIn.setVisible(false);

logOut.setVisible(true);

}

else

{

logIn.setVisible(true);

logOut.setVisible(false);

}

return true;

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

logIn = menu.findItem(R.id.loggedOut);

logOut = menu.findItem(R.id.loggedIn);

return true;

}

timv answered 2020-08-07T00:16:45Z

0 votes

在Android 3.0及更高版本上,您应该调用invalidateOptionsMenu()来请求系统调用onPrepareOptionsMenu()。 然后,您可以在方法中修改选项菜单。 您可以在[https://developer.android.com/guide/topics/ui/menus#options-menu]中查看Android文档的“在运行时更改菜单项”部分,以了解更多详细信息。

Dara answered 2020-08-07T00:17:05Z

android 动态修改菜单,如何在Android的“选项”菜单上更改MenuItem?相关推荐

  1. Android动态修改icon

    Android动态修改icon 南京证券项目最近的需求之一,在某一时间时应用图标icon显示4.0icon,春节时显示春节icon,当春节过后,app需还原为默认icon,也就是有三个icon需要变化 ...

  2. android 动态修改控件的宽高

    今天,简单讲讲android如何动态设置控件的宽高. 这个其实也比较简单,但是之前做的时候出现了问题,代码里设置的宽高是dx,需要先转成dp.下面以RelativeLayout作为例子,简单记录一下. ...

  3. Android动态修改桌面图标新坑总结

    一.优秀文章概述 下面的文章描述动态修改桌面图标的基本方法,并且总结了很多坑及解决方案,以下是在此文章基础上的补充 <Android动态修改应用图标和名称> 二.第一个新坑 Android ...

  4. android菜单详解二:选项菜单

    创建一个选项菜单 选项菜单里应该包含基本的activity动作和必须的导航条目 (例如,一个打开程序设置的菜单项). 选项菜单的菜单项有两种不同的选择方法,一是菜单项按钮,二是通过 Action Ba ...

  5. Android动态修改选中和不选中的Button图片颜色

    需求: 标题可能不太容易让人理解,直接看图吧: 比如这三个Button,选中的时候图片是蓝色,不选中的时候图片是白色.正常情况下,切图要切两套,一张白底,一张蓝底.可如果UI只给你白底呢?那么也只能代 ...

  6. android 动态渐变,Android 动态修改渐变 GradientDrawable

    Android 绘图学习 1GradientDrawable 简介 以前的文章写过 Android中渐变实现方式 前面的文章 讲解了如何实现渐变类似LinearGradient,SweepGradie ...

  7. Android动态修改icon--让你的app浪起来

    文章时间久远,仅做参考. 公司APP最近做活动(12.12)要换APP图标,产品说活动前上一个版,放12.12的icon,等活动过了再更新一个版,换成平常的图标. 顿时我就生气了,淘宝京东都可以动态换 ...

  8. android更改menu字体颜色,Android动态修改menu颜色

    昨晚有人在群里问怎么动态修改menu的颜色 关键对方还说在网上百度了3个小时了,依然没有解决问题 我知道,轮到我出手了

  9. android 禁用通知栏_如何在Android上禁用通知

    android 禁用通知栏 Notifications are great, and Android's notification system is arguably the best out th ...

最新文章

  1. js原生操作select、radio 、checkbox
  2. ASP.NET WebAPI String 传值问题
  3. 单元测试之Mockito与PowerMock
  4. elsa-core——1.Hello World:Console
  5. redis-springboot-redistemplate更改序列化方式
  6. php 数组 构造为树,从PHP中的平面数组构建树
  7. HTTP协议的无状态性
  8. java-web 过滤器 amp; 监听器 amp; 拦截器
  9. NSString copy or not (strong)?
  10. 【noi 2.6_162】Post Office(DP)
  11. vim 树形目录插件NERDTree安装
  12. PS软件Photoshop设置使用鼠标进行放大缩小设置
  13. asp 在线发送邮件
  14. 基于JAVA毕业生交流学习平台计算机毕业设计源码+系统+数据库+lw文档+部署
  15. 剑指Offer面试题22(Java版):栈的压入、弹出序列
  16. python导入文件方法大全
  17. android 图片底部波浪线,Android实现波浪线效果(xml bitmap)
  18. 十进制如何转化为二进制和六进制
  19. 手把手教你构建 C 语言编译器(8)- 表达式
  20. 什么是驱动?驱动程序的工作原理?

热门文章

  1. android studio on/off 切换开关,如何使用android studio中的开关小部件来启用/禁用函数()?...
  2. linux 几个文件夹作用,linux下每一个文件夹的作用.docx
  3. 如何挑选一款合适的POE工业级交换机?
  4. 非管理型工业交换机和管理型工业交换机的区别和选择
  5. 交换机多少钱一个?影响工业交换机价格的因素?
  6. 【渝粤教育】 广东开放大学21秋期末考试劳动和社会保障法10682k2
  7. 【渝粤教育】国家开放大学2018年秋季 0222-22T模拟电子电路 参考试题
  8. 【渝粤题库】陕西师范大学209912 金融中介学Ⅰ 作业
  9. 【渝粤题库】陕西师范大学210001儿童心理学 作业(高起专、高起本)
  10. 【渝粤题库】广东开放大学 人力资源管理 形成性考核