Как скрыть и показать пункты меню на панели действий - PullRequest
0 голосов
/ 26 мая 2019

У меня есть система пунктов меню, реализованная в моей панели действий, я пытаюсь заставить пункт меню стать невидимым после нажатия, а затем снова стать видимым после нажатия другого пункта меню.

Причинаэто сделано для предотвращения щелчка по пункту меню более одного раза.

Я сделал следующую попытку ниже, однако, я получаю ошибку исключения нулевого указателя.Я полагаю, что мне может понадобиться реализовать некоторые операторы 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();

1 Ответ

1 голос
/ 26 мая 2019

Недостаточно изменить переменную isVisible. Вы должны вызывать метод setVisible() каждый раз, когда хотите изменить видимость. Этот метод делает больше, чем просто устанавливает логическое значение, поэтому простое изменение логического значения не поможет.

После изменения значения 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();
...
...