【背景】
Android中,已经实现菜单的显示了:
现在需要根据不同的情况,去动态显示或隐藏菜单。
【折腾过程】
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后,是变灰色了:
而不是想要的隐藏掉。
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); } } }
结果:
真的竟然可以了。。
如图:
菜单显示出来:
隐藏掉菜单:
【总结】
想要代码中动态的显示或隐藏掉菜单,则是获得对应的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); } }
即可实现:
代码中动态可以显示或隐藏对应的菜单了。
转载请注明:在路上 » 【已解决】Android中动态显示或隐藏菜单