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

如何在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java性能监控:您应该了解的5个开源工具

鲜为人知但有用:开源应用程序性能监视的状态 对于任何应用程序来说,最重要的事情之一就是性能。 我们要确保用户获得他们能获得的最佳体验,并且要知道我们的应用已启动并正在运行。 这就是为什么我们大多数人至少使用一种监视工具的原因。 …

【BZOJ1069】【SCOI2007】—最大土地面积(凸包+旋转卡壳)

传送门 考虑枚举任意222个点&#xff0c;那么只需要枚举第二个点的时候旋转卡壳就可以O(n)O(n)O(n)得到最远点对了 #include<bits/stdc.h> using namespace std; inline int read(){char chgetchar();int res0,f1;while(!isdigit(ch)){if(ch-)f-f;chgetchar();}while(isd…

如何在vs2010中修改栈的大小

上次运行程序的时候提示栈溢出&#xff0c;oh,my god 程序栈空间不够用了&#xff0c;没关系&#xff0c;可以设置栈的大小&#xff0c;默认是1MB。 选择 项目->属性->链接器->系统->堆栈保留大小,然后输入你想要的栈大小即可。

android第三方登录appid,AndroidQQ第三方登录

集成QQ登录在lib导入该open_sdk_r5886_lite.jar包AndroidManifest.xmlandroid:name"com.tencent.tauth.AuthActivity"android:launchMode"singleTask"android:noHistory"true" >android:theme"android:style/Theme.Translucent.NoTitleB…

Java数组、集合的三种遍历方式(包懂)

1 for循环 for(int i 0;i<arr.length;i){System.out.print(arr[i]" "); } 2 foreach循环&#xff0c;这种方式结构简单&#xff0c;可以简化代码 for(int i:arr){System.out.print(arr[i]" "); } 3 迭代器遍历 对于数组而言&#xff0c;就没必要转换为…

你应当如何学习C++(以及编程)(rev#1)

你应当如何学习C(以及编程)(rev#1) By 刘未鹏(pongba) C的罗浮宫(http://blog.csdn.net/pongba) JavaScript是世界上最受误解的语言&#xff0c;其实C何尝不是。坊间流传的错误的C学习方法一抓就是一大把。我自己在学习C的过程中也走了许多弯路&#xff0c;浪费了不少时间。 为…

android 悬浮窗口和主界面同时显示,Android 悬浮窗口(及解决6.0以上无法显示问题)...

思路实现通过WindowManager添加一个View&#xff0c;创建一个系统顶级的窗口&#xff0c;实现悬浮窗口的效果。本篇思路&#xff0c;来源于郭霖大神的悬浮窗口教程。大致介绍WindowManager 类创建的对象&#xff1a;Context.getSystemService(Context.WINDOW_SERVICE)常用API:a…

谷歌guava_Google Guava BloomFilter

谷歌guava当Guava项目发布版本11.0时&#xff0c;新添加的功能之一是BloomFilter类。 BloomFilter是唯一的数据结构&#xff0c;用于指示元素是否包含在集合中。 使BloomFilter有趣的是&#xff0c;它将指示元素是否绝对不包含或可能包含在集合中。 永远不会出现假阴性的特性使…

CMDB学习之三数据采集

判断系统因为是公用的方法&#xff0c;所有要写基类方法使用&#xff0c;首先在插件中创建一个基类 将插件文件继承基类 思路是创建基类使用handler.cmd ,命令去获取系统信息&#xff0c;然后进行判断&#xff0c;然后去执行 磁盘 &#xff0c;cpu&#xff0c;网卡&#xff0c;…

linux下挂载iso镜像的方法

新建目录/mnt/cdrom 执行命令 mount /dev/cdrom /mnt/cdrom 12[rootocdp1 cdrom]# mount /dev/cdrom /mnt/cdrommount: /dev/sr0 写保护&#xff0c;将以只读方式挂载进入/mnt/cdrom文件夹下发现里面是空的&#xff0c;说明挂载失败。 现在很多发行版中&#xff0c;光驱都不是/…

android onitemclicklistener 参数,android – OnItemClickListener从模型中获取数据

我是Android开发的新手,我正在尝试构建一个ListView,它使用gson从Web服务获取数据.我有一个模型类,一个列表类,一个适配器类和活动类.该列表工作正常,它获得了数据,现在我想将OnItemClickListener集成到它并将数据传递给第二个活动.我想得到项ID(DistrictId)并将其传递给下一个…

Java 8:对速度3.0.1“森林”流ORM的更深入了解

沿着这条路 我一直在为开源项目Speedment &#xff08;它是Stream ORM Java Toolkit和Runtime&#xff09;做出贡献&#xff0c;并且刚刚发布了一个新的主要版本3.0.1“ Forest”。 版本的发布以加利福尼亚州帕洛阿尔托的大街小巷命名&#xff0c;大多数贡献者都在这里工作。 沿…

读《人月神话》有感

翻开《人月神话》这本书&#xff0c;我感觉看这本与我们学的相关的书不相似&#xff0c;书中用了很多的形象的比喻&#xff0c;来阐述项目管理中的一些问题&#xff0c;让人以很轻松愉悦心态去阅读。书开始就形象有有趣的把软件危机比作&#xff1a;焦油坑。让我感觉到&#xf…

android 弹窗in,Android监听程序处于INACTIVITY(未操作状态)时间并作出相应的操作

最近遇到一个需求&#xff0c;app五分钟未操作需要返回到主页面。一开始就想到去监听onTouch和onClick事件&#xff0c;这个方法看似可行&#xff0c;但是实际操作起来还是很繁琐的&#xff0c;一不小心就达不到需要的效果。然后就果断放弃了。后来看api发现activity中有一个叫…

用gdb调试nasm汇编程序

对于一个程序员来说&#xff0c;调试是很重要的&#xff0c;可以节约找到bug的时间&#xff0c;不过以前在linux下一直是对c进行调试的&#xff0c;今天突然要对汇编进行调试还真不知道怎么调&#xff0c;特别是对linux下调试汇编程序基本没搞过。记得以前上课学masm时&#xf…

android 防腾讯新闻标题栏,仿腾讯视频android客户端上方的标题栏

如图&#xff0c;上方的导航栏是不是很酷&#xff0c;首先它本身是可以滑动的&#xff0c;然后右侧有一个可以查看所有Tab的按钮&#xff0c;然后他和下方的ViewPager还是联动的&#xff0c;可以通过点击它切换ViewPager&#xff0c;并且ViewPager滑动&#xff0c;它也会随着改…

链接克隆 完整克隆_深入克隆

链接克隆 完整克隆在继续克隆概念之前&#xff0c;让我们用对象创建概念刷新基础知识。 使用new运算符创建对象时&#xff0c;对象将在堆中获取内存分配。 堆中的对象创建 在Java中&#xff0c;理想情况下仅通过引用变量修改对象&#xff0c;即仅复制对象的内存地址&#xff…

linux系统调用和库函数调用的区别

Linux下对文件操作有两种方式&#xff1a;系统调用&#xff08;system call&#xff09;和库函数调用&#xff08;Library functions&#xff09;。可以参考《Linux程序设计》&#xff08;英文原版为《Beginning Linux Programming》&#xff0c;作者是Neil Matthew和Richard S…

如果您在2016年编写过Java代码-这是您不容错过的趋势

2016年最有趣的Java相关主题 关于代码&#xff0c;有很多热门话题&#xff0c;而要跟上所有事情&#xff0c;这是一项全职的工作。 如果您想知道如何从谷壳中分离出小麦&#xff0c;我们已经为您完成了工作。 在下面的文章中&#xff0c;我们将介绍2016年最热门的内容&#x…

第三届蓝桥杯省赛---第39级台阶

第39级台阶 小明刚刚看完电影《第39级台阶》&#xff0c;离开电影院的时候&#xff0c;他数了数礼堂前的台阶数&#xff0c;恰好是39级! 站在台阶前&#xff0c;他突然又想着一个问题&#xff1a; 如果我每一步只能迈上1个或2个台阶。先迈左脚&#xff0c;然后左右交替&#xf…