【背景】
Android中,已经实现菜单的显示了:
现在需要根据不同的情况,去动态显示或隐藏菜单。
【折腾过程】
1.参考:
android – How do I hide a menu item in the actionbar? – Stack Overflow
试了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | @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.改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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.再试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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.再试试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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即可。
完整部分的代码为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | @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中动态显示或隐藏菜单