Android: как полностью отключить функцию копирования и вставки в Edittext

Я довольно новичок в области разработки Android, и недавно я столкнулся с серьезной проблемой.

Я пытался создать Edittext, который НЕ ПОЗВОЛИТ пользователю копировать контент или вставлять контент в него. Я много гуглил и обнаружил, что есть два популярных способа сделать это:

1-й способ, чтобы установить его в файле макета:

android:longClickable="false"

2-й способ, чтобы программно установить его:

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

Но я только что обнаружил, что какой бы путь я не выбрал, область редактирования текста может быть отключена только при длительном нажатии, что затем не позволяет пользователю получить доступ к меню "выбрать все, скопировать и вставить" при длительном нажатии. Но оба решения не препятствовали пользователю получить доступ к функции "вставки" простым касанием курсора.

Поэтому мой вопрос: как я могу ПОЛНОСТЬЮ заблокировать пользователя от функции копирования и вставки в определенном тексте редактирования. Кто-нибудь помогает? Большое спасибо

4 ответа

Решение

Есть одна возможность, отключив обработчик курсора. Вы не получите кнопку вставки, но вы также не сможете перемещать курсор касанием.

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getActionMasked() == MotionEvent.ACTION_UP && mDisableCursorHandle) {
        // Hack to prevent keyboard and insertion handle from showing.
        cancelLongPress();
    }
    return super.onTouchEvent(event);
}

Лучший программный способ это:

myEdittext.setLongClickable(false);

Или просто в xml

android:longClickable="false"

Вы можете полностью скрыть меню "выбрать все, скопировать и вставить", а также функцию "вставить", которая появляется при простом нажатии на курсор.

Для этого вам нужно создать собственный класс EditText. Вот пример...

// Custom EditText class
public class NoMenuEditText extends EditText
{
    private final Context context;

    /** 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
    */
    boolean canPaste()
    {
        return false;
    }

    /** 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
    public boolean isSuggestionsEnabled()
    {
        return false;
    }

    public NoMenuEditText(Context context)
    {
        super(context);
        this.context = context;
        init();
    }

    public NoMenuEditText(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this.context = context;
        init();
    }

    public NoMenuEditText(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        this.context = context;
        init();
    }

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


    /**
    * 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
    {
        private final String TAG = NoMenuEditText.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) {}
    }
} 

Используйте этот EditText в вашем макете. Теперь он не будет отображать меню копирования / вставки. Он будет показывать только синий маркер, но когда вы нажмете на него, вы не получите всплывающее окно с возможностью вставки.

Надеюсь это поможет...

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

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

        }
    });
   }
}

предварительный просмотр образца

Другие вопросы по тегам