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

При использовании Xcode 6 и он говорит

Ожидание make

Возможно, экземпляр make уже запущен. Убейте процесс и индексирование. Глупо, но работал для меня.

29
задан hrsetyono 2 March 2013 в 12:43
поделиться

6 ответов

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

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

1) Добавьте два нижеприведенных свойства в XML-файл EditText

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

или

2) Программно сделайте следующее

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

И все готово.

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

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

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

android:editable="false"

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

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

Используйте этот код ниже, чтобы обнаружить появление клавиатуры (решение получено из https://stackoverflow.com/a/9108219/1241783 ) и немедленно скрыть ее.

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

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

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

51
ответ дан Community 2 March 2013 в 12:43
поделиться

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

getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
    WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
33
ответ дан Santacrab 2 March 2013 в 12:43
поделиться

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

 EditText et = ... // your EditText

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

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

2
ответ дан AndroidEnthusiastic 2 March 2013 в 12:43
поделиться

Чтобы отключить автоматическое всплывающее окно системной клавиатуры для 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
}
3
ответ дан Suragch 2 March 2013 в 12:43
поделиться

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

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

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

7
ответ дан Anonsage 2 March 2013 в 12:43
поделиться

Имел подобную потребность из-за моего пользовательского встроенного "поддельного" входа, который был все еще видим как OS, мягкая клавиатура появлялась после фокуса, перемещенного в текст редактирования. Решение состояло в том, чтобы заставить текст редактирования скрыть мягкий вход, пока предыдущий пользовательский входной виджет не закончил свой жизненный цикл редактирования.

Используемый ответ @Bruce для вдохновения, также видел несколько связанных сообщений, которые я присоединю в конце. Решение, которое я нашел работавшим, было:

fun setInputType(inputType: Int) {
        getEditText().setRawInputType(inputType)
        if (inputType == InputType.TYPE_NULL) {
            getEditText().setTextIsSelectable(true)
            getEditText().isCursorVisible = true
        }
    }

должен был использовать setRawInputType() вместо этого, поскольку вход многострочного текста не уважали когда сходящий InputType.TYPE_NULL назад к InputType.TYPE_TEXT_FLAG_MULTI_LINE.

Кажется, что существуют пользователи, сообщающие о проблемах, касающихся вызова setInputType(InputType.TYPE_NULL). см.: https://issuetracker.google.com/issues/36907992

другие полезные связанные сообщения:

, Как сделать EditText не доступным для редактирования через XML в Android?

EditText, не доступный для редактирования

1
ответ дан 28 November 2019 в 00:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: