5

I have a requirement where EditText doesn't allow paste but it should allow copy. I tried setCustomSelectionActionModeCallback but it disables the copy option.

EditText  etxt = (EditText) findViewById(R.id.editText1);
etxt.setCustomSelectionActionModeCallback(new Callback() {
             
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }
 
            public void onDestroyActionMode(ActionMode mode) {                  
            }
 
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return false;
            }
 
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }
        });
auspicious99
  • 3,902
  • 1
  • 44
  • 58
Surendra
  • 124
  • 2
  • 7

3 Answers3

2

I did it myself..credit goes to Android intercept paste\copy\cut on editText

I just changed onTextContextMenuItem() based on my requirement..

@Override
    public boolean onTextContextMenuItem(int id) {
        // Do your thing:
        //boolean consumed = super.onTextContextMenuItem(id); // Change1
        // React:
        switch (id){
            case android.R.id.cut:
                onTextCut();
                break;
            case android.R.id.paste:
                onTextPaste();
                return false;       //Change2
                //break;
            case android.R.id.copy:
                onTextCopy();
        }
        return true; // Change3
    }
auspicious99
  • 3,902
  • 1
  • 44
  • 58
Surendra
  • 124
  • 2
  • 7
0

If you are using API level 11 or above use this

      edittext.setCustomSelectionActionModeCallback(new Callback() {

        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public void onDestroyActionMode(ActionMode mode) {                  
        }

        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }
    });
Maxwell
  • 552
  • 2
  • 5
  • 20
0

If you want to disable only the paste option, I think it is better to remove the paste context menu item, this is a util method I implemented in my apps to achieve that (I also removed cut item)

    public static void toggleContextMenuType(EditText editText) {

    if (editText.getCustomSelectionActionModeCallback() == null) {
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {
            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                menu.removeItem(16908322);
                menu.removeItem(16908320);
                return true;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {
            }
        });
    }else{
        editText.setCustomSelectionActionModeCallback(null);
    }
}
maxshuty
  • 9,708
  • 13
  • 64
  • 77
  • Don't hard-code integer values of IDs, use Android constants for that: `android.R.id.paste` (16908322), `android.R.id.cut` (16908320) – Dmitry K Jul 20 '21 at 07:31