Nano Hash - криптовалюты, майнинг, программирование

Как отключить копирование / вставку из / в EditText

В моем приложении есть экран регистрации, на котором я не хочу, чтобы пользователь мог копировать / вставлять текст в поле 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, которая может иметь кнопку для копирования / вставки или может отображать то же контекстное меню. Итак, как мне отключить копирование / вставку в этом сценарии?

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

Любая помощь будет оценена.


  • Если операция вставки выполняется из IME, у вас нет стандартного способа отличить ее от обычных нажатий клавиш. Одна из идей, которую стоит попробовать, - это измерить время между прибытием каждого персонажа, и если время слишком мало, то символы появляются в результате операции вставки. 13.11.2011
  • вроде грязное решение! хотя стоит посмотреть. 14.11.2011
  • используйте android: longClickable = false 25.06.2019
  • Вывод для всех, кажется, такой: вы действительно не можете сделать это хорошо. Однако для моих личных целей я хочу отключить вставку, потому что я не могу обрабатывать определенные символы, которые присутствуют, и вставка может разрешить их в мой EditText. Тогда решение состоит в том, чтобы добавить прослушиватель измененного текста и в методе afterTextChanged удалить эти символы, если они там есть. Вы можете добавить несколько слушателей и, таким образом, создать такой, который предотвращает слишком длинный текст, недопустимые символы и т. Д. Это не предпочтительно. Но если кто-то искал полуприличное обходное решение, я думаю, что это он. 14.11.2020

Ответы:


1

Если вы используете уровень 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) предотвратит запуск режима действия (действия «Выбрать все», «Вырезать», «Копировать» и «Вставить»).

08.09.2012
  • как насчет уровня API ниже 13? 08.02.2013
  • Не понимаю ни одного комментария, этот образец работает api11 +, pre-api11 не было копирования и вставки IIRC 11.09.2013
  • У меня не работает. Кнопка вставки появится при нажатии на синий индикатор курсора. 24.03.2014
  • Также у меня не работает. При двойном нажатии отображается меню копипаста. 09.08.2014
  • это больше не работает на android 6.0, проверьте этот ответ stackoverflow.com/questions/27869983/ 16.08.2016
  • Это решение хорошее (но не идеальное), к сожалению, в моем случае оно вызвало NPE в части кода Android (иногда во время тестирования обезьяны), поэтому мне пришлось найти другое решение, см. Мой ответ ниже 13.01.2017
  • Это работает, только когда EditText не пуст. Это Doest не работает, когда в edittext есть тексты. 20.08.2018
  • @Humble coder вышеуказанное решение не работает moto g5 mobile и в ОС oreo. решение для всех устройств - использовать метод ниже: edittext.setCustomInsertionActionModeCallback (); 17.12.2018

  • 2

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

    etUsername.setLongClickable(false);
    
    11.12.2012
  • Или просто в xml android:longClickable="false" :) 24.01.2014
  • Кнопка «Вставить» появится при нажатии на синий индикатор курсора. 13.03.2014
  • Это, безусловно, предотвратит длительное нажатие на представление, но элементы управления редактированием также могут быть запрошены двойным нажатием на текст, что означает, что это решение не является полным. Имейте это в виду для своих целей. 22.04.2014
  • Кроме того, сочетания клавиш по-прежнему могут работать (Ctrl + C) с внешней клавиатурой. 13.06.2014
  • Это не работает с Ice Cream Sandwich, потому что параметры буфера обмена можно открыть двойным касанием текста, а также долгим касанием. 01.05.2017
  • но я все еще хочу выделить текст, просто без виджета 18.11.2017

  • 3

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

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

    android:longClickable="false"
    
    25.09.2014
  • Проблема заключалась в том, что у моего пользователя приложения есть сторонняя клавиатура с кнопкой копирования и вставки. 16.04.2015
  • другая проблема заключается в том, что вы можете выбрать текст двойным нажатием, и он снова показывает копирование / вставку 24.01.2018

  • 4

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

    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);
    

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

    06.09.2012
  • Это то же самое решение, к которому я пришел, основываясь на других ответах выше. Это следует отметить как правильное решение, так как оно учитывает крайние случаи, которые другие не делают. 03.04.2018
  • Эта опция блокирует копию, но вы все равно можете вставить, щелкнув курсор. 27.11.2018

  • 5

    Котлинское решение:

    fun TextView.disableCopyPaste() {
        isLongClickable = false
        setTextIsSelectable(false)
        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?) {}
        }
    }
    

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

    override fun onCreate() {
        priceEditText.disableCopyPaste()
    }
    
    20.07.2017
  • Привет, я использую этот подход, но получаю Type mismatch ошибку с этим описанием Required:ActionMode.Callback! Found: в этой части object: ActionMode.Callback. Есть идеи, почему это может не работать? 14.12.2019

  • 6

    вот лучший способ отключить вырезанную копию пасты работы 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;
                }
            });
        }
    
    31.03.2014
  • У меня это сработало, мне просто нужно было добавить @TargetApi (Build.VERSION_CODES.HONEYCOMB) 24.04.2014

  • 7

    В дополнение к setCustomSelectionActionModeCallback и отключены решения с долгим щелчком, необходимо запретить отображение меню ВСТАВИТЬ / ЗАМЕНИТЬ при выделении текста ручка нажата, как показано на изображении ниже:

    Маркер выделения текста с меню вставки

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

    Более полный ответ можно найти здесь.

    06.03.2015
  • Это ПРАВИЛЬНОЕ и ПОЛНОЕ решение 26.01.2016
  • В некоторых устройствах вместо «Вставить буфер обмена» видна опция, действует только как вставка. Я проверил ссылки, но могу предотвратить вставку, но не буфер обмена. любая идея ? 18.02.2020

  • 8

    Если вы не хотите отключать долгий щелчок, потому что вам нужно выполнять некоторые функции при длинном щелчке, чем возврат 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. Он отлично работает для меня. Надеюсь, это поможет.

    24.07.2017
  • Неплохо. В качестве альтернативы просто установите android:longClickable="false" в XML 01.10.2018

  • 9

    Вот хитрость, чтобы отключить всплывающее окно «вставить». Вы должны переопределить EditText метод:

    @Override
    public int getSelectionStart() {
        for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
            if (element.getMethodName().equals("canPaste")) {
                return -1;
            }
        }
        return super.getSelectionStart();
    }
    

    То же самое можно сделать и для других действий.

    19.01.2017
  • Вы можете сказать, что буфер обмена отключен 18.02.2020

  • 10

    Я протестировал это решение, и оно работает

        mSubdomainEditText.setLongClickable(false);
        mSubdomainEditText.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;
          }
        });
    
    03.08.2019
  • Я использовал этот код, он предотвращает попадание в буфер обмена, вариант копирования.Спасибо 08.09.2020

  • 11

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

    myEditText.disableCopyAndPaste().

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

    14.11.2013
  • Это делает то же самое, что и полурешение, предоставляемое stackoverflow.com/a/22756538/3063884. См. Код: github.com/neopixl/PixlUI/blob/master/Library/src/com/neopixl/ ... Этот подход по-прежнему не мешает обработчику выделения текста отображать PASTE, если в буфере обмена есть текст. 28.02.2015

  • 12

    @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;
        }
    
    12.10.2012

    13

    Я добавил функцию расширения в язык Kotlin:

    fun EditText.disableTextSelection() {
        this.setCustomSelectionActionModeCallback(object : android.view.ActionMode.Callback {
            override fun onActionItemClicked(mode: android.view.ActionMode?, item: MenuItem?): Boolean {
                return false
            }
            override fun onCreateActionMode(mode: android.view.ActionMode?, menu: Menu?): Boolean {
                return false
            }
            override fun onPrepareActionMode(mode: android.view.ActionMode?, menu: Menu?): Boolean {
                return false
            }
            override fun onDestroyActionMode(mode: android.view.ActionMode?) {
            }
        })
    }
    

    вы можете использовать это так:

    edit_text.disableTextSelection()
    

    также добавил строку ниже в ваш xml:

                    android:longClickable="false"
                    android:textIsSelectable="false"
    
    10.06.2020

    14

    Прочтите буфер обмена, проверьте ввод и время, когда ввод «набран». Если в буфере обмена есть тот же текст, но он слишком быстрый, удалите вставленный ввод.

    14.11.2011

    15

    решение очень простое

    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) {
    
            }
        });
       }
    }
    

    --------> предварительный просмотр ‹---------

    07.07.2018

    16

    Попробуйте следовать классу клиентов для преобладающего копирования и вставки в Edittext

    public 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) {
    
        }
    }
    

    }

    10.08.2018

    17

    Для смартфона с буфером обмена можно предотвратить подобное.

    editText.setFilters(new InputFilter[]{new InputFilter() {
            @Override
            public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                if (source.length() > 1) {
                    return "";
                }  return null;
            }
        }});
    
    18.12.2018

    18

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

    23.11.2011

    19

    Решение, которое сработало для меня, заключалось в создании настраиваемого 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);
    }
    

    }

    13.01.2017

    20

    Попробуй использовать.

    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;
            }
        });
    
    25.01.2018

    21

    Кто ищет решение в Kotlin, используйте приведенный ниже класс в качестве настраиваемого виджета и используйте его в xml.

    class SecureEditText: TextInputEditText {

    /** This is a replacement method for the base TextView class' method of the same name. This method
     * is used in hidden class android.widget.Editor to determine whether the PASTE/REPLACE popup
     * appears when triggered from the text insertion handle. Returning false forces this window
     * to never appear.
     * @return false
     */
    override fun isSuggestionsEnabled(): Boolean {
        return false
    }
    
    override fun getSelectionStart(): Int {
        for (element in Thread.currentThread().stackTrace) {
            if (element.methodName == "canPaste") {
                return -1
            }
        }
        return super.getSelectionStart()
    }
    
    public override fun onSelectionChanged(start: Int, end: Int) {
    
        val text = text
        if (text != null) {
            if (start != text.length || end != text.length) {
                setSelection(text.length, text.length)
                return
            }
        }
    
        super.onSelectionChanged(start, end)
    }
    
    companion object {
        private val EDITTEXT_ATTRIBUTE_COPY_AND_PASTE = "isCopyPasteDisabled"
        private val PACKAGE_NAME = "http://schemas.android.com/apk/res-auto"
    }
    
    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        disableCopyAndPaste(context, attrs)
    }
    
    /**
     * Disable Copy and Paste functionality on EditText
     *
     * @param context Context object
     * @param attrs   AttributeSet Object
     */
    private fun disableCopyAndPaste(context: Context, attrs: AttributeSet) {
        val isDisableCopyAndPaste = attrs.getAttributeBooleanValue(
            PACKAGE_NAME,
            EDITTEXT_ATTRIBUTE_COPY_AND_PASTE, true
        )
        if (isDisableCopyAndPaste && !isInEditMode()) {
            val inputMethodManager =
                context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            this.setLongClickable(false)
            this.setOnTouchListener(BlockContextMenuTouchListener(inputMethodManager))
        }
    }
    
    /**
     * Perform Focus Enabling Task to the widget with the help of handler object
     * with some delay
     * @param inputMethodManager is used to show the key board
     */
    private fun performHandlerAction(inputMethodManager: InputMethodManager) {
        val postDelayedIntervalTime: Long = 25
        Handler().postDelayed(Runnable {
            [email protected](true)
            [email protected]()
            inputMethodManager.showSoftInput(
                this@SecureEditText,
                InputMethodManager.RESULT_SHOWN
            )
        }, postDelayedIntervalTime)
    }
    
    /**
     * Class to Block Context Menu on double Tap
     * 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
     *
     * @param inputMethodManager is used to show the key board
     */
    private inner class BlockContextMenuTouchListener internal constructor(private val inputMethodManager: InputMethodManager) :
        View.OnTouchListener {
        private var lastTapTime: Long = 0
        val TIME_INTERVAL_BETWEEN_DOUBLE_TAP = 30
        override fun onTouch(v: View, event: MotionEvent): Boolean {
            if (event.getAction() === MotionEvent.ACTION_DOWN) {
                val currentTapTime = System.currentTimeMillis()
                if (lastTapTime != 0L && currentTapTime - lastTapTime < TIME_INTERVAL_BETWEEN_DOUBLE_TAP) {
                    [email protected](false)
                    performHandlerAction(inputMethodManager)
                    return true
                } else {
                    if (lastTapTime == 0L) {
                        lastTapTime = currentTapTime
                    } else {
                        lastTapTime = 0
                    }
                    performHandlerAction(inputMethodManager)
                    return true
                }
            } else if (event.getAction() === MotionEvent.ACTION_MOVE) {
                [email protected](false)
                performHandlerAction(inputMethodManager)
            }
            return false
        }
    }
    

    }

    14.01.2020

    22

    Если вы хотите отключить ActionMode для копирования / вставки, вам необходимо переопределить 2 обратных вызова. Это работает как для TextView, так и для EditText (или TextInputEditText)

    import android.view.ActionMode
    
    fun TextView.disableCopyPaste() {
      isLongClickable = false
      setTextIsSelectable(false)
      customSelectionActionModeCallback = object : ActionMode.Callback {
        override fun onCreateActionMode(mode: ActionMode?, menu: Menu) = false
        override fun onPrepareActionMode(mode: ActionMode?, menu: Menu) = false
        override fun onActionItemClicked(mode: ActionMode?, item: MenuItem) = false
        override fun onDestroyActionMode(mode: ActionMode?) {}
      }
      //disable action mode when edittext gain focus at first
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        customInsertionActionModeCallback = object : ActionMode.Callback {
          override fun onCreateActionMode(mode: ActionMode?, menu: Menu) = false
          override fun onPrepareActionMode(mode: ActionMode?, menu: Menu) = false
          override fun onActionItemClicked(mode: ActionMode?, item: MenuItem) = false
          override fun onDestroyActionMode(mode: ActionMode?) {}
        }
      }
    }
    

    Это расширение основано на вышеупомянутом решении @Alexandr и отлично сработало для меня.

    18.11.2020

    23

    Широко совместимое решение (начиная с Android 1.5) -

    @Override
    public boolean onTextContextMenuItem(int id) {
        switch (id){
            case android.R.id.cut:
                onTextCut();
                return false;
            case android.R.id.paste:
                onTextPaste();
                return false;
            case android.R.id.copy:
                onTextCopy();
                return false;
        }
        return true;
    }
    
    23.03.2021

    24

    Как и в GnrlKnowledge, вы можете очистить буфер обмена.

    http://developer.android.com/reference/android/text/ClipboardManager.html

    Если хотите, сохраните текст в буфере обмена, а на onDestroy вы можете установить его снова.

    23.11.2011

    25

    Вы можете попробовать android: focusableInTouchMode = "false".

    20.04.2016
  • Это никогда не сработает 06.02.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..