android使用menu需要重写的方法,Android – 正确使用invalidateOptionsMenu()

我一直在关注invalidateOptionsMenu() ,我知道它的作用。 但是我想不出这个方法可能有用的任何现实生活中的例子。

我的意思是,例如,假设我们想要为ActionBar添加一个新的MenuItem ,我们可以从onCreateOptionsMenu(Menu menu)获取菜单,并在任何按钮的操作中使用它。

现在我真正的问题是,遵循使用invalidateOptionsMenu()的唯一方法?

bool _OtherMenu; protected override void OnCreate (Bundle bundle) { _OtherMenu = false; base.OnCreate (bundle); SetContentView (Resource.Layout.Main); Button button = FindViewById(Resource.Id.myButton); button.Click += delegate { if(_OtherMenu) _OtherMenu = false; else _OtherMenu = true; InvalidateOptionsMenu (); }; } public override bool OnCreateOptionsMenu (IMenu menu) { var inflater = this.SupportMenuInflater; if(_OtherMenu) inflater.Inflate (Resource.Menu.another_menu, menu); else inflater.Inflate (Resource.Menu.main_activity_menu, menu); return base.OnCreateOptionsMenu (menu); }

单击按钮,将出现另一个菜单。 再次单击该按钮,将出现上一个菜单。

PS对不起C#语法。

invalidateOptionsMenu()用于表示Android,菜单内容已更改,菜单应重新绘制。 例如,单击在运行时添加另一个菜单项的按钮,或隐藏菜单项组。 在这种情况下,您应该调用invalidateOptionsMenu() ,以便系统可以在UI上重绘它。 此方法是操作系统调用onPrepareOptionsMenu()的信号,您可以在其中实现必要的菜单操作。 此外, OnCreateOptionsMenu()在活动(片段)创建期间仅调用一次,因此此方法无法处理运行时菜单更改。

所有都可以在文档中find:

在系统调用onCreateOptionsMenu()之后,它会保留您填充的菜单的实例,并且不会再次调用onCreateOptionsMenu(),除非由于某种原因菜单失效。 但是,您应该仅使用onCreateOptionsMenu()来创建初始菜单状态,而不是在活动生命周期中进行更改。

如果要根据活动生命周期中发生的事件修改选项菜单,可以在onPrepareOptionsMenu()方法中执行此操作。 此方法会将Menu对象传递给当前存在,以便您可以对其进行修改,例如添加,删除或禁用项目。 (片段还提供onPrepareOptionsMenu()回调。)

在Android 2.3.x及更低版本中,每次用户打开选项菜单(按菜单按钮)时,系统都会调用onPrepareOptionsMenu()。

在Android 3.0及更高版本中,当操作栏中显示菜单项时,选项菜单被视为始终打开。 当事件发生并且您想要执行菜单更新时,必须调用invalidateOptionsMenu()以请求系统调用onPrepareOptionsMenu()。

使用此命令在应用程序生命周期中重新加载新菜单:

ActivityCompat.invalidateOptionsMenu(getActivity());

你需要重写onPrepareOptionsMenu()方法,用同样的方法编写动作菜单的更新代码,如果你使用的是片段,那么添加setHasOptionsMenu(true); 在onCreateView() 。

希望它能帮到你

我发现的一个用途是强制onResume和onCreateOptionsMenu/onPrepareOptionsMenu之间的操作顺序。 自然顺序(至少从平台22开始)似乎会翻转,特别是在重新定位设备时。

在onResume ()中调用invalidateOptionsMenu (),你将保证在onResume之后调用onPrepareOptionsMenu (之前可能另外调用它)。 例如,这将允许基于onResume检索的数据启用菜单项。

编辑:这是一个更好的答案问题。

对于invalidateOptionsMenu()一个很好的用途是当我们有一个ListView和Delete All MenuItem时,所以当ListView为空时我们应该使用invalidateOptionsMenu()来删除Delete All MenuItem 。

这是与此答案相关的问题: 问题 。

/** * Set a hint for whether this fragment's menu should be visible. This * is useful if you know that a fragment has been placed in your view * hierarchy so that the user can not currently seen it, so any menu items * it has should also not be shown. * * @param menuVisible The default is true, meaning the fragment's menu will * be shown as usual. If false, the user will not see the menu. */ public void setMenuVisibility(boolean menuVisible) { if (mMenuVisible != menuVisible) { mMenuVisible = menuVisible; if (mHasMenu && isAdded() && !isHidden()) { mHost.onSupportInvalidateOptionsMenu(); } } }

XML菜单示例:

示例片段中的代码:

private boolean isMenuItemChecked; @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setMenuVisibility(false); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.my_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public void onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); try { menu.findItem(R.id.action_check).setVisible(!isMenuItemChecked); menu.findItem(R.id.action_uncheck).setVisible(isMenuItemChecked); } catch(Exception e) { Log.e(TAG, "onPrepareOptionsMenu error"); } } public void loadUi(boolean isMenuItemChecked) { this.isMenuItemChecked = isMenuItemChecked; setMenuVisibility(true); }

对我有用的最佳方式如下所示

将菜单的初始状态放在onCreateOptionsMenu(…)中

使用invalidateOptionsMenu()强制onCreateOptionsMenu(…)和onPrepareOptionsMenu(…)

在onPrepareOptionsMenu(…)中,调用menu.clear()从菜单中删除所有项目。

仍然在onPrepareOptionsMenu(…)中将动态菜单更改为清除后

希望这可以帮助…

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

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

相关文章

织梦留言板guestbook.htm加入头部导航

织梦仿站的时候如果有留言板,通常都是不像织梦这样的留言板独立的页面;都是带头部导航的。那么如何在guestbook.htm加入头部导航;如果直接加入head.htm的话。标签在这里是无法调用的;我们必须使用函数来解决这个问题; …

8.2 css3 新增标签 盒子模型 长度单位 颜色 渐变 径像渐变

# CSS3 盒子模型* box-sizing 值 content-box 默认值 包括所有的值 / border-box 只算边框的长与宽* resize(调节框的大小) * 值 none不允许 / horizontal调节宽度 / vertical调节高度 / both都可以* outline轮廓边框 o…

android keyboardview去掉点击效果,KeyboardView is deprecated in android

问题KeyboardView has been deprecated official by android team in API level 29 and i didnt able to find the alternative way for this. Please let me know if there any alternative?回答1:From the docs here :This class was deprecated in API level 29. This clas…

浅析dedecms织梦网站留言板提交时验证码错误的解决办法

默认情况下,如果我们使用DEDE模板中的默认留言板时,如果留言信息不正确或者输入内容为空时,dedecms系统就会返回一个空 白页。这样的方式很不利于用户体验,解决这个问题实际上非常简单。 找到dedecms留言板文件/plus/guestbook.ph…

Tomcat服务器的安装及配置

学习目标: 了解Tomcat服务器的主要作用掌握Tomcat服务器的安装与配置掌握Tomcat安装目录下主要文件夹的作用jsp的执行流程1.Web的工作原理流程图:从图中可以看出Tomcat服务器的主要作用就是接受客户端的请求和响应。 2.jsp执行流程 1)客户端发…

android 后台执行js,android - 当应用程序在后台运行时,Android WebView消耗大量电能...

我的Android应用程序中有一个WebView,并且此WebView运行的网站上带有相当多的Javascript。当我的应用程序在后台运行时,用户报告了高功耗,我希望这是由于此javascript。但是,我不想完全卸载或删除WebView,因为这会影响…

织梦DEDE网站后台如何上传附件

首先登录织梦网站后台: 分别点击 核心 — 附件管理 — 文件式管理 里面有织梦自带的几个文件夹,包括图片,视频,软件等文件夹。我们来新建一个file文件夹 点击 新建目录 建立file文件夹。 默认应该是跳转进file文件夹了&#xff…

Hands-On Modeler (建模人员参与程序开发)

如果编写代码的人员认为自己没必要对模型负责,或者不知道让模型为应用程序服务,那么这个模型就和程序没有任何关联.如果开发人员没有意识到改变代码就意味着改变模型,那么他们对程序的重构不但不会增强模型的作用,反而会削弱他的效果, 同样,如果建模人员不参与到程序的实现过程…

泰拉瑞亚mod鸿蒙方舟,三款高评分的沙盒生存类手游,经典之作泰拉瑞亚你有玩过吗?...

沙盒类游戏由一个或多个地图区域构成,往往包含多种游戏要素,包括角色扮演,动作、射击、驾驶等等。能够改变或影响甚至创造世界是沙盒游戏的特点。自由度高也成为了沙盒游戏的一个标配,所以今天小皮就给大家推荐几款超赞的沙盒生存…

织梦返回上一页面

ShowMsg("成功退出登录!","javascript:history.back(-1)",0,2000); ShowMsg("成功退出登录!",$_SERVER[HTTP_REFERER],0,2000); $_SERVER[HTTP_REFERER] 是上一页的url

android任务 进程 线程详解,Android任务、进程、线程详解

singleTop模式,基本上于standard分歧,仅正在请求的Activity反好位于栈顶时,无所区别。此时,配放成singleTop的Activity,不再会构制新的实例加入到Task栈外,而是将新来的Intent发送到栈顶Activity外&#xf…

截取地址栏URL参数

UrlParm function() { // url参数var data, index;(function init() {data [];index {};var u window.location.search.substr(1);if(u ! ) {var parms decodeURIComponent(u).replace(/&/g,"&").split(&);for(var i 0, len parms.length; i …

android 清理缓存 简书,分享:Android清除本地数据缓存代码

/**文 件 名:DataCleanManager.java*描述:主要功能有清除内/外缓存,清除数据库,清除sharedPreference,清除files和清除自定义目录*/importjava.io.File;importandroid.content.Context;importandroid.os.Environment;/** *本应用数据清除管理…

[AH/HNOI2017]大佬

题目描述 人们总是难免会碰到大佬。他们趾高气昂地谈论凡人不能理解的算法和数据结构,走到任何一个地方,大佬的气场就能让周围的人吓得瑟瑟发抖,不敢言语。 你作为一个 OIER,面对这样的事情非常不开心,于是发表了对大佬…

csdn markdown 编辑器开启

1、打开我的博客网址https://mp.csdn.net/ 2、在博客设置栏目中勾选markdown,并且选择自己喜欢的主题 3、保存

html检查输入为空,html input输入验证不为空

html5的话使用required即可,比较简单。但是ie10以下的浏览器没有required特性。所以就要靠其他方式来对用户输入做验证。下面是利用js的方法:function validate(){var domain document.getElementById(domain).value;var domainInfo document.getEleme…