программно получить дескрипторы выбора в Android

В моем приложении у меня есть элемент EditText, но я использую его как TextView (он не редактируется).

Я хочу выделить весь текст в этом поле, нажав на какую-нибудь кнопку. Я делаю это со следующим кодом

Selection.setSelection((Spannable) et.getText(),0, et.getText().length());
et.setSelected(true);

Он отлично работает, и текст выбран, но после этого я не могу изменить конец выделения. Как я могу вызвать дескрипторы выбора программно?

Также я заблокировал OnLongClick, потому что мне нужна только опция «Копировать» и добавить ее в пользовательскую кнопку.


person lubart    schedule 22.04.2013    source источник


Ответы (3)


Вам нужно убедиться, что EditText имеет свойство android:textIsSelectable="true" в файле макета.

Вы также можете сделать то же самое с помощью et.setTextIsSelectable(true);

Но убедитесь, что minSdkVersion вашего приложения равно 11, чтобы использовать это.

person Tanmay Mandal    schedule 22.04.2013
comment
Спасибо за ответ! Я нашел этот способ, но мне нужен код для minSdkVersion=8. Является ли это возможным? может быть какое-то обходное решение? Мне нужна только возможность пользовательского выбора текста и его копирования, но без программной клавиатуры и контекстного меню. - person lubart; 22.04.2013

Попробуйте что-нибудь вроде этого

 et.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
            int strt=   et.getSelectionStart();
            int end =   et.getSelectionEnd();
                Log.i(" Selectionm",et.getText().toString().substring(strt, end));
                return false;
            }
        });
person Arun C    schedule 22.04.2013
comment
Спасибо за ответ, но ничего не происходит. Я получил в LogCat весь выделенный текст. - person lubart; 22.04.2013

С обязательным android:textIsSelectable="true" вызовите следующий метод с EditText или TextView в качестве параметра:

private fun forceSelectionWithHandlesVisible(view: TextView) {
    if (!view.hasSelection()) {
        view.performLongClick()
    }
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
        // Hack required to make the selection handles visible when focus programmatically
        val event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0F, 0F, 0)
        with(event) {
            view.onTouchEvent(this)
            recycle()
        }
    }
}

Работал на меня.

person jhavatar    schedule 26.08.2020