首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在操作栏上隐藏和显示菜单项

如何在操作栏上隐藏和显示菜单项
EN

Stack Overflow用户
提问于 2019-05-26 23:29:02
回答 1查看 43关注 0票数 0

我在我的操作栏中实现了一个菜单项系统,我试图让一个菜单项在单击后变得不可见,然后在单击不同的菜单项后再次变为可见。

这样做的原因是为了防止菜单项被多次单击。

我做了下面的尝试,但是,我得到了一个空指针异常错误。我相信我可能需要在这里实现一些if语句,但是我不确定如何去做。

代码语言:javascript
复制
@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.tasklistmenu,menu);

    return true;
}//OnCreateOptionsMenu


@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case R.id.allTasks:

            item.setVisible(false);


            MenuItem notStartedStatus = findViewById(R.id.notStartedStatus);
            notStartedStatus.setVisible(true);

            MenuItem inProgressStatus = findViewById(R.id.inProgressStatus);
            inProgressStatus.setVisible(true);

            MenuItem completeStatus = findViewById(R.id.completeStatus);
            completeStatus.setVisible(true);

日志错误

代码语言:javascript
复制
Attempt to invoke interface method 'android.view.MenuItem 
android.view.MenuItem.setVisible(boolean)' on a null object reference

新代码

代码语言:javascript
复制
 @Override
public boolean onPrepareOptionsMenu(Menu menu) {

    MenuItem allTasks = menu.findItem(R.id.allTasks);
    MenuItem notStartedStatus = menu.findItem(R.id.notStartedStatus);
    MenuItem completeStatus = menu.findItem(R.id.completeStatus);
    MenuItem inProgressStatus = menu.findItem(R.id.inProgressStatus);


    if(tasksIsVisible) {
        allTasks.setVisible(true);
    } else {
        allTasks.setVisible(false);
    }

    if(notStartedIsVisible) {
        notStartedStatus.setVisible(true);
    } else {
        notStartedStatus.setVisible(false);
    }

    if(completeIsVisible) {
        completeStatus.setVisible(true);
    } else {
        completeStatus.setVisible(false);
    }

    if(inProgressIsVisible) {
        inProgressStatus.setVisible(true);
    } else {
        inProgressStatus.setVisible(false);
    }

    return true;

}//OnPrepareOptions

 @Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

        case R.id.allTasks:

            tasksIsVisible = false;
            invalidateOptionsMenu();
EN

回答 1

Stack Overflow用户

发布于 2019-05-26 23:41:45

仅更改isVisible变量是不够的。每次要更改可见性时,都必须调用setVisible()方法。该方法不仅仅是设置布尔值,所以只更改布尔值是行不通的。

在将isVisible值更改为false之后,您需要调用invalidateOptionsMenu(),这将通过再次调用onPrepareOptionsMenu()来重新启动菜单。

代码语言:javascript
复制
public boolean onPrepareOptionsMenu(Menu menu)
{
    MenuItem notStartedStatus = menu.findItem(R.id.notStartedStatus);      
    if(isVisible) 
    {           
        notStartedStatus.setVisible(true);
    }
    else
    {
        notStartedStatus.setVisible(false);
    }
    return true;
}

尝试使用此代码使菜单项不可见:

代码语言:javascript
复制
...
isVisible = false;
invalidateOptionsMenu();
...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56314877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档