Подтвердить что ты не робот

Отключить мягкую клавиатуру из EditText, но разрешить копирование/вставку?

Привет, я создаю пользовательский дозвон, поэтому создаю свой собственный входной блок.

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

Я пробовал android:focusable="false", но он отключает вырезание/копирование (может все же вставить).

Я также попытался отключить inputType программно, что отключает все три команды:

myEditText.setInputType(InputType.TYPE_NULL); //Can't cut/copy/paste

Отключение его из манифеста также не работает:

android:configChanges="orientation|keyboardHidden" //Keyboard still popped up

Любое решение? Благодаря

4b9b3361

Ответ 1

После нескольких часов и часов исследований я наконец нашел решение, которое работает для всех версий API. Надеюсь, это экономит время.

Если вы разрабатываете API >= 11, решение прост:

1) Добавьте два свойства ниже в xml файл EditText

android:inputType="none"
android:textIsSelectable="true"

или

2) Программно выполните приведенные ниже

myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setTextIsSelectable(true);

И все готово.

Если вы хотите обслуживать API < 11, я обнаружил, что нет возможности отключить клавиатуру от выпадающего меню, если вы хотите выбрать текст для цели копирования. Настройка focusable на false отключит клавиатуру, но это не поможет, поскольку она отключает возможность выбора текста. Любые другие решения, которые я нашел в stackoverflow, либо не работают, либо отключают выбор текста одновременно.

Один уродливый способ решить это как таковой.

Сначала добавьте это свойство в xml файл EditText

android:editable="false"

Да, это устарело, но необходимо для того, чтобы сделать EditText недоступным для редактирования в версии API < 11.

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

Используйте этот код для обнаружения клавиатуры (решение, полученное из fooobar.com/questions/16169/...), и немедленно скройте его.

if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
{
    final View activityRootView = findViewById(R.id.activityRoot);
    activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    @Override
        public void onGlobalLayout() {
            Rect r = new Rect();
            //r will be populated with the coordinates of your view that area still visible.
            activityRootView.getWindowVisibleDisplayFrame(r);

            int heightDiff = activityRootView.getRootView().getHeight() - (r.bottom - r.top);
            if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...

            //Hide the keyboard instantly!
            if (getCurrentFocus() != null) 
            {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
            }
            }
         }
        });
}

Это работает для моего дела. Хотя вы можете видеть, что клавиатура появляется в течение секунды (что является уродливой частью), но я не могу придумать другого способа заставить это работать на момент написания. Если у вас есть лучшее решение, оставьте комментарий!

Дайте мне знать, если это экономит время:)

Ответ 2

Чтобы отключить отображение мягкой клавиатуры, сохраняя функцию копирования/вставки и курсора, просто добавьте эту строку в свою активность:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Ответ 3

Поскольку текущий верхний ответ использует устаревший метод и не имеет метода вставки для меня, здесь другой способ, который не использует старые методы. Но он пытается использовать скрытый метод посредством отражения с резервным. =)

Я подклассифицировал EditText в новый виджет под названием KeyboardlessEditText, который по-прежнему сохраняет все классные функции редактирования без показа клавиатуры. Просто запустите файл и идите.

Полный код для этого сообщения немного длинный, но пока GitHub не опустится, это будет работать: https://github.com/danialgoodwin/android-widget-keyboardless-edittext/blob/master/KeyboardlessEditText2.java

Ответ 4

попробуйте это

 EditText et = ... // your EditText

et.setKeyListener(null) //makes the EditText non-editable so, it acts like a TextView.

Нет необходимости в подклассе. Основное отличие этого и сделать ваш EditText неактивным, заключается в том, что EditText по-прежнему имеет свой собственный указатель - вы можете выбрать текст и т.д. Все, что он делает, это подавление IME от появления своей мягкой клавиатуры.

Ответ 5

Чтобы отключить автоматическую всплывающую клавиатуру системы для EditText или TextView, выполните следующие действия:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    editTextView.setShowSoftInputOnFocus(false);
} else {
    editTextView.setTextIsSelectable(true);
    //N.B. Accepting the case when non editable text will be selectable
}