Как отключить копирование / вставку из / в EditText - PullRequest
115 голосов
/ 08 июня 2011

В моем приложении есть экран регистрации, на котором я не хочу, чтобы пользователь мог копировать / вставлять текст в поле EditText.Я установил onLongClickListener для каждого EditText, чтобы не отображалось контекстное меню, отображающее метод копирования / вставки / ввода и другие параметры.Таким образом, пользователь не сможет копировать / вставлять в поля редактирования.

 OnLongClickListener mOnLongClickListener = new OnLongClickListener() {

        @Override
        public boolean onLongClick(View v) {
            // prevent context menu from being popped up, so that user
            // cannot copy/paste from/into any EditText fields.
            return true;
        }
    };

Но проблема возникает, если пользователь включил стороннюю клавиатуру, отличную от Android по умолчанию, которая может иметькнопка для копирования / вставки или который может показать то же контекстное меню.Так как же отключить копирование / вставку в этом сценарии?

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

Буду признателен за любую помощь.

Ответы [ 21 ]

115 голосов
/ 11 декабря 2012

Лучший метод - использовать:

etUsername.setLongClickable(false);
108 голосов
/ 08 сентября 2012

Если вы используете API уровня 11 или выше, вы можете остановить копирование, вставку, вырезание и настраиваемые контекстные меню от появления.

edittext.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;
            }
        });

Возвращение false из onCreateActionMode (ActionMode, Menu)запретит запуск режима действия (действия «Выбрать все», «Вырезать», «Копировать» и «Вставить»).

34 голосов
/ 25 сентября 2014

Вы можете сделать это, отключив долгое нажатие EditText

Чтобы реализовать это, просто добавьте следующую строку в xml -

android:longClickable="false"
33 голосов
/ 06 сентября 2012

Я могу отключить функцию копирования и вставки с помощью следующего:

textField.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

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

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

    public boolean onActionItemClicked(ActionMode actionMode, MenuItem item) {
        return false;
    }

    public void onDestroyActionMode(ActionMode actionMode) {
    }
});

textField.setLongClickable(false);
textField.setTextIsSelectable(false);

Надеюсь, это работает для вас; -)

12 голосов
/ 31 марта 2014

вот лучший способ отключить вырезанную копию вставки работы editText во всех версиях

if (android.os.Build.VERSION.SDK_INT < 11) {
        editText.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {

            @Override
            public void onCreateContextMenu(ContextMenu menu, View v,
                    ContextMenuInfo menuInfo) {
                // TODO Auto-generated method stub
                menu.clear();
            }
        });
    } else {
        editText.setCustomSelectionActionModeCallback(new ActionMode.Callback() {

            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public void onDestroyActionMode(ActionMode mode) {
                // TODO Auto-generated method stub

            }

            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                // TODO Auto-generated method stub
                return false;
            }

            public boolean onActionItemClicked(ActionMode mode,
                    MenuItem item) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }
7 голосов
/ 06 марта 2015

В дополнение к setCustomSelectionActionModeCallback и отключенным длинным щелчкам решениям необходимо предотвратить появление меню PASTE / REPLACE при обработке дескриптора выбора текстащелкают, как показано на изображении ниже:

Text selection handle with paste menu

Решение заключается в предотвращении появления меню PASTE / REPLACE в методе show() (недокументированное) android.widget.Editor класс.Перед появлением меню выполняется проверка на if (!canPaste && !canSuggest) return;.Оба метода, используемые в качестве основы для установки этих переменных, находятся в классе EditText:

Более полный ответ доступен здесь .

6 голосов
/ 27 августа 2018

Используя другие решения, API 26 (Oreo) по-прежнему отображал дескриптор курсора одним нажатием на введенный текст, после чего можно было отобразить меню.Только комбинация решений может решить мою проблему.

public class CustomEditText extends EditText {

    public CustomEditText(Context context) {
        super(context);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        this.setCustomSelectionActionModeCallback(new BlockedActionModeCallback());
        this.setLongClickable(false);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            this.setInsertionDisabled();
        }
        return super.onTouchEvent(event);
    }

    /**
    * This method sets TextView#Editor#mInsertionControllerEnabled field to false
    * to return false from the Editor#hasInsertionController() method to PREVENT showing
    * of the insertionController from EditText
    * The Editor#hasInsertionController() method is called in  Editor#onTouchUpEvent(MotionEvent event) method.
    */
    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) {
        }
    }
}
4 голосов
/ 20 июля 2017

Решение Kotlin:

fun TextView.disableCopyPaste() {
    customSelectionActionModeCallback = object : ActionMode.Callback {
        override fun onCreateActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu): Boolean {
            return false
        }

        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem): Boolean {
            return false
        }

        override fun onDestroyActionMode(mode: ActionMode?) {}
    }
    isLongClickable = false
    setTextIsSelectable(false)
}

Тогда вы можете просто вызвать этот метод на вашем TextView:

override fun onCreate() {
    priceEditText.disableCopyPaste()
}
4 голосов
/ 24 июля 2017

Если вы не хотите отключать длинный щелчок, потому что вам нужно выполнить некоторые функции при длинном щелчке, тогда лучше выбрать для этого значение true.

Ваш длинный текст редактирования текста будет таким.

edittext.setOnLongClickListener(new View.OnLongClickListener() {
      @Override
      public boolean onLongClick(View v) {
            //  Do Something or Don't
            return true;
      }
});

Согласно документации Возвращение "True" будет означать, что длинный щелчок был обработан, поэтому нет необходимости выполнять операции по умолчанию.

Я проверял это на APIуровень 16, 22 и 25. Это нормально работает для меня.Надеюсь, это поможет.

3 голосов
/ 14 ноября 2013

https://github.com/neopixl/PixlUI предоставляет EditText с методом

myEditText.disableCopyAndPaste().

И он работает на старом API

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...