如何设置Android MenuItems的切换。当另一个点击时如何显示?

时间:2019-04-05 15:24:48

标签: android menuitem android-menu

我有一个笔记记录活动,我希望能够编辑和保存(基本上覆盖)相同的笔记。

一旦单击编辑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 个答案:

答案 0 :(得分:1)

  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
    }