北京网站seo价格,电子技术网,深圳市宝安区松岗街道,软件开发一般要多少钱如何在Android的“选项”菜单上更改MenuItem#xff1f;我的Activity上有一个选项菜单#xff0c;带有mymenu.xml“开始”。 选择此3000128611611048489985后#xff0c;我想更改菜单#xff0c;使其包含MenuItem“停止”。 最后#xff0c;当选择“停止”时#xff0c;我…如何在Android的“选项”菜单上更改MenuItem我的Activity上有一个选项菜单带有mymenu.xml“开始”。 选择此3000128611611048489985后我想更改菜单使其包含MenuItem“停止”。 最后当选择“停止”时我想改回“开始”。这是我的部分代码无法正常工作。 我在mymenu.xml中同时列出了“开始”和“停止”创建菜单时可能应该删除“停止”public class MyActivity extends Activity {private boolean isStarted false;Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater getMenuInflater();menu.removeItem(R.id.stop);inflater.inflate(R.menu.mymenu, menu);return true;}Overridepublic 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);}}Overridepublic 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对于这种类型的操作我通常选择不更改菜单项而只隐藏不需要的菜单项Overridepublic 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:15Z20 votesFlygenring的答案是正确的但是menu.findItem()太慢了在onPrepareOptionsMenu(Menu menu)中调用它会产生不良的用户体验。 最好在创建菜单时获取一次MenuItem对象然后每次在屏幕上出现菜单时都调用setVisibleMenuItem mDynamicMenuItem;Overridepublic 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 itemmDynamicMenuItem menu.findItem(R.id.menu_item);return true;}// Prepare the Screens 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.Overridepublic boolean onPrepareOptionsMenu(Menu menu) {super.onPrepareOptionsMenu(menu);// Here is just a good place to update itemmDynamicMenuItem.setVisible(isVisible);return true;}i.shadrin answered 2020-08-07T00:15:35Z6 votes完成更改后可能需要调用super.onPrepareOptionsMenu。 从文档派生类应始终调用 直到基层 实施。Cheryl Simon answered 2020-08-07T00:16:00Z3 votes我找到了解决方案。 调用false时基本上就是删除MenuItem因此也删除了引用。 使用此代码有效。private boolean isStarted false;Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case 1:isStarted true;return true;case 0:isStarted false;return true;default:return super.onOptionsItemSelected(item);}}Overridepublic 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:24Z1 votes感谢您提供这篇文章中的信息因为它解决了我菜单中错误标签的问题。 我确实需要对其进行一些修改并使其最终代码可以正常工作如下所示希望它可以节省其他人的时间和挫败感。 它的解决方案稍有不同但我所做的主要更改是将.setVisible更改为True或False除了i.shadrins解决方案最适合我的需求。Overridepublic boolean onPrepareOptionsMenu(Menu menu) {super.onPrepareOptionsMenu(menu);if(loggedIn){logIn.setVisible(false);logOut.setVisible(true);}else{logIn.setVisible(true);logOut.setVisible(false);}return true;}Overridepublic 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:45Z0 votes在Android 3.0及更高版本上您应该调用invalidateOptionsMenu()来请求系统调用onPrepareOptionsMenu()。 然后您可以在方法中修改选项菜单。 您可以在[https://developer.android.com/guide/topics/ui/menus#options-menu]中查看Android文档的“在运行时更改菜单项”部分以了解更多详细信息。Dara answered 2020-08-07T00:17:05Z