【背景】
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中动态显示或隐藏菜单