如何为 Android 菜单项设置切换。如何在单击另一个时显示一个?

How to set toggle for Android MenuItems. How to show one when the other is clicked?

我有一个笔记 activity 我希望能够在其中编辑和保存(基本上是覆盖)相同的笔记。

单击编辑 MenuItem 后,我希望它隐藏然后显示保存的 MenuItem。

我可以让编辑的 MenuItem 不可见,但我无法让保存的 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 文件

@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. 向您的 activity 添加标志,指示 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
    }