1. 程式人生 > >[譯]禁止EditText彈出複製黏貼

[譯]禁止EditText彈出複製黏貼

原文連結:https://stackoverflow.com/questions/41673185/disable-edittext-context-menu

禁止exittext彈出複製黏貼

解決問題分三步

step 1

mEditEext.setCustomSelectionActionModeCallback(new ActionMode.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; } });

step 2

mEditText.setLongClickable(false
);

或者

android:longClickable="false"

step 3

  1. 繼承EditText類
  2. 重寫isSuggestionsEnabled並返回false
  3. 建立canPaste()方法並返回false。該方法是隱藏的

快捷修復方式

public class MenuHidingEditText extends EditText {
    private final Context mContext;

    public MenuHidingEditText(Context context) {
        super(context);
        this
.mContext = context; blockContextMenu(); } public MenuHidingEditText(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; blockContextMenu(); } public MenuHidingEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.mContext = context; blockContextMenu(); } private void blockContextMenu() { this.setCustomSelectionActionModeCallback(new BlockedActionModeCallback()); this.setLongClickable(false); this.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { MenuHidingEditText.this.clearFocus(); return false; } }); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { // setInsertionDisabled when user touches the view this.setInsertionDisabled(); } return super.onTouchEvent(event); } private void setInsertionDisabled() { try { Field editorField = TextView.class.getDeclaredField("mEditor"); editorField.setAccessible(true); Object editorObject = editorField.get(this); Class editorClass = Class.forName("android.widget.Editor"); Field mInsertionControllerEnabledField = editorClass.getDeclaredField("mInsertionControllerEnabled"); mInsertionControllerEnabledField.setAccessible(true); mInsertionControllerEnabledField.set(editorObject, false); } catch (Exception ignored) { // ignore exception here } } @Override public boolean isSuggestionsEnabled() { return false; } private class BlockedActionModeCallback implements ActionMode.Callback { public boolean onCreateActionMode(ActionMode mode, Menu menu) { return false; } public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } public void onDestroyActionMode(ActionMode mode) { } } }