【已解决】Android中动态显示或隐藏菜单

【背景】

Android中,已经实现菜单的显示了:

【已解决】Android添加Menu菜单

现在需要根据不同的情况,去动态显示或隐藏菜单。

【折腾过程】

1.参考:

android – How do I hide a menu item in the actionbar? – Stack Overflow

试了:

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		mMenu = menu;

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);

		hiddenEditMenu();

		return true;
	}
	
	private void hiddenEditMenu(){
		if(null != mMenu){
	//		MenuInflater menuInflater = getMenuInflater();
	//	    menuInflater.inflate(R.menu.activity_main, menu);
			//hidden when first time 
	        for (int i = 0; i < mMenu.size(); i++){
	        	mMenu.getItem(i).setVisible(false);
	        }
		}
	}
	
	private void showEditMenu(){
		if(null != mMenu){
	        for (int i = 0; i < mMenu.size(); i++){
	        	mMenu.getItem(i).setVisible(true);
	        }
		}
	}

但是没能起到动态显示和隐藏的效果:

直接导致menu都不显示了。。

2.打算参考:

contextmenu – Android: How to enable/disable option menu item on button click? – Stack Overflow

去试试onPrepareOptionsMenu看看效果,不过暂时不去试了。

3.改为:

	private void hiddenEditMenu(){
		if(null != mMenu){
	//		MenuInflater menuInflater = getMenuInflater();
	//	    menuInflater.inflate(R.menu.activity_main, menu);
			//hidden when first time 
	        for (int i = 0; i < mMenu.size(); i++){
	        	//mMenu.getItem(i).setVisible(false);
	        	mMenu.getItem(i).setEnabled(false);
	        }
		}
	}
	
	private void showEditMenu(){
		if(null != mMenu){
	        for (int i = 0; i < mMenu.size(); i++){
	        	//mMenu.getItem(i).setVisible(true);
	        	mMenu.getItem(i).setEnabled(true);
	        }
		}
	}

试试效果:

结果enable为false后,是变灰色了:

android title disabled to gray

而不是想要的隐藏掉。

4.再试试:

	private void hiddenEditMenu(){
		if(null != mMenu){
	//		MenuInflater menuInflater = getMenuInflater();
	//	    menuInflater.inflate(R.menu.activity_main, menu);
			//hidden when first time 
	        for (int i = 0; i < mMenu.size(); i++){
	        	mMenu.getItem(i).setVisible(false);
	        	mMenu.getItem(i).setEnabled(false);
	        }
		}
	}
	
	private void showEditMenu(){
		if(null != mMenu){
	        for (int i = 0; i < mMenu.size(); i++){
	        	mMenu.getItem(i).setVisible(true);
	        	mMenu.getItem(i).setEnabled(true);
	        }
		}
	}

结果是:

还是不显示。

5.再试试:

	public boolean onCreateOptionsMenu(Menu menu) {
		mMenu = menu;

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);

		//hiddenEditMenu();

		return true;
	}
	
	private void hiddenEditMenu(){
		if(null != mMenu){
	//		MenuInflater menuInflater = getMenuInflater();
	//	    menuInflater.inflate(R.menu.activity_main, menu);
			//hidden when first time 
	        for (int i = 0; i < mMenu.size(); i++){
	        	mMenu.getItem(i).setVisible(false);
	        	mMenu.getItem(i).setEnabled(false);
	        }
		}
	}
	
	private void showEditMenu(){
		if(null != mMenu){
	        for (int i = 0; i < mMenu.size(); i++){
	        	mMenu.getItem(i).setVisible(true);
	        	mMenu.getItem(i).setEnabled(true);
	        }
		}
	}

结果:

真的竟然可以了。。

如图:

菜单显示出来:

android show menu and keyboard

隐藏掉菜单:

android hidden menu and not show keyboard

 

【总结】

想要代码中动态的显示或隐藏掉菜单,则是获得对应的menu后,对于每个menuitem去枚举,设置setVisible和setEnabled为true或false即可。

 

完整部分的代码为:

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		mMenu = menu;

		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_main, menu);

		//when first create menu, can NOT hidden them here, otherwise later will not show menus
		//hiddenEditMenu();

		return true;
	}
	
	private void hiddenEditMenu(){
		if(null != mMenu){
	        for (int i = 0; i < mMenu.size(); i++){
	        	mMenu.getItem(i).setVisible(false);
	        	mMenu.getItem(i).setEnabled(false);
	        }
		}
	}
	
	private void showEditMenu(){
		if(null != mMenu){
	        for (int i = 0; i < mMenu.size(); i++){
	        	mMenu.getItem(i).setVisible(true);
	        	mMenu.getItem(i).setEnabled(true);
	        }
		}
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
	    // Handle item selection
	    switch (item.getItemId()) {
	        case R.id.menu_discard:
	        	//Toast.makeText(MainActivity.this, "Menu Discard cliked", Toast.LENGTH_SHORT).show();
	        	clearEditedVarValues();
	            return true;
	        case R.id.menu_send:
	        	//Toast.makeText(MainActivity.this, "Menu Send cliked", Toast.LENGTH_SHORT).show();
	        	writeEditedVarValues();
	            return true;
	        default:
	            return super.onOptionsItemSelected(item);
	    }
	}

 

即可实现:

代码中动态可以显示或隐藏对应的菜单了。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量