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

标签 java android menuitem

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

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

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

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

日志错误

Attempt to invoke interface method 'android.view.MenuItem 
android.view.MenuItem.setVisible(boolean)' on a null object reference

新代码

 @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();

最佳答案

仅更改 isVisible 变量是不够的。每次想要更改可见性时,都必须调用 setVisible() 方法。该方法不仅仅只是设置 boolean 值,因此仅更改 boolean 值是不行的。

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

public boolean onPrepareOptionsMenu(Menu menu)
{
    MenuItem notStartedStatus = menu.findItem(R.id.notStartedStatus);      
    if(isVisible) 
    {           
        notStartedStatus.setVisible(true);
    }
    else
    {
        notStartedStatus.setVisible(false);
    }
    return true;
}

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

...
isVisible = false;
invalidateOptionsMenu();
...

关于java - 如何在操作栏上隐藏和显示菜单项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56314877/

相关文章:

java - Android 应用程序中 MarkerOptions.position 中的 NullPointer 与 Google map

c# - 如何在运行时使用MenuItems动态填充MenuItem?

c++ - 如何在 C++ 应用程序中自动检查菜单的完整性?

java - Google Drive v3 java API 获取服务帐户配额

Java printf 性能

android - 如何禁用 fragment 中的抽屉并返回正确的 fragment

android - 在 ListView 中突出显示整个焦点行

javascript - 当您在页面之间切换时主导航会跳转

java - volatile 保证可变对象的安全发布?

java - LocalDateTime无法解析 "June"