20 ответов:
Если вы используете 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, меню) предотвратит запуск режима действия (Выберите все, вырезать, копировать и вставлять действия).
вы можете сделать это, отключив длительное нажатие EditText
чтобы реализовать его, просто добавьте следующую строку в xml -
android:longClickable="false"
Я могу отключить функцию копирования и вставки со следующим:
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);надеюсь, что это работает для вас ;-)
вот лучший способ отключить вырезать копировать вставить 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; } }); }
в дополнение к setCustomSelectionActionModeCallback и щелкните инвалидов решения, это необходимо запретить вставку / замену меню от появления при нажатии ручки выбора текста, как на изображении ниже:
решение заключается в предотвращении вставки / замены меню от появления в
show()метод (не документированный)android.widget.Editorкласса. Перед меню оказывается, проверка делается наif (!canPaste && !canSuggest) return;. Два метода, которые используются в качестве основы для установки этих переменных, находятся вEditTextкласс:
isSuggestionsEnabled()и общественные, и, таким образом, могут быть переопределены.canPaste()нет, и поэтому должен быть скрыт введение функции с тем же именем в производном классе.более полный ответ доступные здесь.
Если вы не хотите отключать длинный щелчок, потому что вам нужно выполнить некоторые функции при длинном щелчке, чем возврат true-лучший вариант для этого.
ваш длинный щелчок edittext будет таким.
edittext.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { // Do Something or Don't return true; } });по состоянию на документация Возврат "True" будет означать, что длинный щелчок был обработан, поэтому нет необходимости выполнять операции по умолчанию.
Я проверил это на уровне API 16, 22 и 25. Он отлично работает для меня. Надеюсь, что это будет помощь.
https://github.com/neopixl/PixlUI обеспечивает
EditTextметодом
myEditText.disableCopyAndPaste().и это работает на старом API
решение Котлин:
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() }
вот хак, чтобы отключить всплывающее окно "вставить". Вы должны переопределить
EditTextспособ:@Override public int getSelectionStart() { for (StackTraceElement element : Thread.currentThread().getStackTrace()) { if (element.getMethodName().equals("canPaste")) { return -1; } } return super.getSelectionStart(); }подобное можно сделать и для других действий.
прочитайте буфер обмена, проверьте вход и время ввода "набран". Если буфер обмена имеет тот же текст, и это слишком быстро, удалите вставленный ввод.
@Zain Ali, ваш ответ работает на API 11. Я просто хотел предложить способ сделать в API 10, а также. Поскольку я должен был поддерживать свой API проекта на этой версии, я постоянно играл с функциями, доступными в 2.3.3, и получил возможность сделать это. У меня есть поделиться фрагмент ниже. Я проверил код, и он работал на меня. Я сделал этот фрагмент по срочности. Не стесняйтесь улучшать код, если есть какие-либо изменения, которые можно сделать..
// A custom TouchListener is being implemented which will clear out the focus // and gain the focus for the EditText, in few milliseconds so the selection // will be cleared and hence the copy paste option wil not pop up. // the respective EditText should be set with this listener // tmpEditText.setOnTouchListener(new MyTouchListener(tmpEditText, tmpImm)); public class MyTouchListener implements View.OnTouchListener { long click = 0; EditText mEtView; InputMethodManager imm; public MyTouchListener(EditText etView, InputMethodManager im) { mEtView = etView; imm = im; } @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { long curr = System.currentTimeMillis(); if (click !=0 && ( curr - click) < 30) { mEtView.setSelected(false); new Handler().postDelayed(new Runnable() { @Override public void run() { mEtView.setSelected(true); mEtView.requestFocusFromTouch(); imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN); } },25); return true; } else { if (click == 0) click = curr; else click = 0; new Handler().postDelayed(new Runnable() { @Override public void run() { mEtView.requestFocusFromTouch(); mEtView.requestFocusFromTouch(); imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN); } },25); return true; } } else if (event.getAction() == MotionEvent.ACTION_MOVE) { mEtView.setSelected(false); new Handler().postDelayed(new Runnable() { @Override public void run() { mEtView.setSelected(true); mEtView.requestFocusFromTouch(); mEtView.requestFocusFromTouch(); imm.showSoftInput(mEtView, InputMethodManager.RESULT_SHOWN); } },25); return true; } return false; }
решение очень простое
public class MainActivity extends AppCompatActivity { EditText et_0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_0 = findViewById(R.id.et_0); et_0.setCustomSelectionActionModeCallback(new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { //to keep the text selection capability available ( selection cursor) return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { //to prevent the menu from appearing menu.clear(); return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { return false; } @Override public void onDestroyActionMode(ActionMode mode) { } }); } }
попробуйте следующий класс custome для предварительного копирования и вставки в
Edittextpublic class SegoeUiEditText extends AppCompatEditText { private final Context context; @Override public boolean isSuggestionsEnabled() { return false; } public SegoeUiEditText(Context context) { super(context); this.context = context; init(); } public SegoeUiEditText(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; init(); } public SegoeUiEditText(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; init(); } private void setFonts(Context context) { this.setTypeface(Typeface.createFromAsset(context.getAssets(), "Fonts/Helvetica-Normal.ttf")); } private void init() { setTextIsSelectable(false); this.setCustomSelectionActionModeCallback(new ActionModeCallbackInterceptor()); this.setLongClickable(false); } @Override public int getSelectionStart() { for (StackTraceElement element : Thread.currentThread().getStackTrace()) { if (element.getMethodName().equals("canPaste")) { return -1; } } return super.getSelectionStart(); } /** * Prevents the action bar (top horizontal bar with cut, copy, paste, etc.) from appearing * by intercepting the callback that would cause it to be created, and returning false. */ private class ActionModeCallbackInterceptor implements ActionMode.Callback, android.view.ActionMode.Callback { private final String TAG = SegoeUiEditText.class.getSimpleName(); 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) {} @Override public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) { return false; } @Override public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) { menu.clear(); return false; } @Override public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) { return false; } @Override public void onDestroyActionMode(android.view.ActionMode mode) { } }}
используя другие решения, 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) { } } }
подобно GnrlKnowledge, вы можете очистить буфер обмена
http://developer.android.com/reference/android/text/ClipboardManager.html
Если вы хотите, сохраните текст в буфере обмена, и на onDestroy, вы можете установить его снова.
Я обнаружил, что при создании входного фильтра, чтобы избежать ввода нежелательных символов, вставка таких символов в текст редактирования не имеет никакого эффекта. Так что это тоже решает мою проблему.
решение, которое работало для меня, состояло в том, чтобы создать пользовательский Edittext и переопределить следующий метод:
public class MyEditText extends EditText { private int mPreviousCursorPosition; @Override protected void onSelectionChanged(int selStart, int selEnd) { CharSequence text = getText(); if (text != null) { if (selStart != selEnd) { setSelection(mPreviousCursorPosition, mPreviousCursorPosition); return; } } mPreviousCursorPosition = selStart; super.onSelectionChanged(selStart, selEnd); }}
попробуйте использовать.
myEditext.setCursorVisible(false); myEditext.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; } });

Comments