Как установить переключатель для Android MenuItems. Как показать один при нажатии на другой? - PullRequest
0 голосов
/ 05 апреля 2019

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

После того, как я щелкну на редактировать MenuItem, я бы хотел, чтобы он скрылся, а затем показал сохраненный MenuItem.

Я могу сделать EditItem невидимым, но не могу сохранить сохраненный MenuItem, чтобы показать. я продолжаю получать исключение нулевого указателя.

вот мой edit_question_menu.xml

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/edit_question"
        android:icon="@drawable/ic_edit_black_24dp"
        android:title="Edit"
        app:showAsAction="ifRoom"
        android:visible="true">
    </item>

    <item
        android:id="@+id/save_question"
        android:icon="@drawable/ic_save_black_24dp"
        android:title="Edit"
        app:showAsAction="ifRoom"
        android:visible="false">
    </item>
</menu>

activity.java file

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.edit_question_menu, menu);
        MenuItem itemSave = menu.findItem(R.id.save_question);
        itemSave.setVisible(false);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.save_question:
                saveQuestion();
                return true;

            case R.id.edit_question:
                item.setVisible(false);

//                MenuItem save_Question_MenuItem = findViewById(R.id.save_question);
//                save_Question_MenuItem.setVisible(true);
                enableEditMode();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    private void enableEditMode(){
        MenuItem saveButton = findViewById(R.id.save_question);
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_black_24dp);
        questionEditText = findViewById(R.id.questionEditTextID);
        mPostAnswerButton.setEnabled(false);
        mPostAnswerButton.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));

        mCommentButton.setEnabled(false);
        mCommentButton.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));

        saveButton.setVisible(true); **ERROR HAPPENS HERE**
    }

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

1 Ответ

1 голос
/ 05 апреля 2019
  1. Добавьте флаг к своей активности, который указывает, где save MenuItem должен быть виден или нет:
private boolean mShowSaveIcon
  1. Переопределить onPrepareOptionsMenu ( ОБНОВЛЕНИЕ ):
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem item = menu.findItem(R.id.save_question);
    item.setVisible(mShowSaveIcon);

    menu.findItem(R.id.edit_question).setVisible(!mShowSaveIcon);  // you can use negation of the same flag if one and only one of two menu items is visible; or create more complex logic

    return true;
}
  1. В обработчике кликов измените значение флага и сделайте запрос недействительным:
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.save_question:
                mShowSaveIcon = false;
                break;

            case R.id.edit_question:
                item.setVisible(false);
                enableEditMode();
                mShowSaveIcon = true;
                break;
         }
         invalidateOptionsMenu();
         return true;
    }
  1. Изменить обработчик:
 private void enableEditMode(){
        /// MenuItem saveButton = findViewById(R.id.save_question); // <--- NO THIS LINE
        getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_black_24dp);
        questionEditText = findViewById(R.id.questionEditTextID);
        mPostAnswerButton.setEnabled(false);
        mPostAnswerButton.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));

        mCommentButton.setEnabled(false);
        mCommentButton.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));
       /// saveButton.setVisible(true); **ERROR HAPPENS HERE** // <--- NO THIS LINE
    }
...