最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

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

Android crifan 7297浏览 0评论

【背景】

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

【已解决】Android添加Menu菜单

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

【折腾过程】

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后,是变灰色了:

android title disabled to gray

而不是想要的隐藏掉。

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);
        }
    }
}

结果:

真的竟然可以了。。

如图:

菜单显示出来:

android show menu and keyboard

隐藏掉菜单:

android hidden menu and not show keyboard

 

【总结】

想要代码中动态的显示或隐藏掉菜单,则是获得对应的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中动态显示或隐藏菜单

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
83 queries in 0.387 seconds, using 22.18MB memory