Отключить программную клавиатуру из EditText, но разрешить копирование / вставку?
Привет, я делаю кастомную звонилку, поэтому создаю свою собственную панель ввода.
Проблема в том, как отключить EditText, но все же разрешить вырезать / копировать / вставить? Стандартная звонилка может сделать это.
я пытался android:focusable="false"
но это отключает вырезать / копировать (все еще можно вставить, хотя).
Я также пытался отключить inputType
программно, который отключает все три команды:
myEditText.setInputType(InputType.TYPE_NULL); //Can't cut/copy/paste
Отключение его из манифеста также не работает:
android:configChanges="orientation|keyboardHidden" //Keyboard still popped up
Любое решение? Спасибо
5 ответов
После долгих часов исследований я наконец нашел решение, которое работает для всех версий 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, клавиатура будет отключена, но это не поможет, поскольку она также отключает возможность выделения текста. Любые другие решения, которые я нашел в stackru, все либо не работают, либо одновременно отключают выделение текста.
Один уродливый способ решить это как таковой..
Сначала добавьте это свойство в XML-файл EditText
android:editable="false"
Да, это не рекомендуется, но необходимо, чтобы EditText не редактировался в версии API < 11.
Затем нам нужно будет скрыть клавиатуру, как только она появится, чтобы мы могли продолжить выделение текста без блокировки клавиатуры.
Используйте этот код ниже, чтобы обнаружить обнаружение клавиатуры (решение получено с /questions/6756085/kak-proverit-vidimost-programmnoj-klaviaturyi-v-android/6756087#6756087) и скрыть ее немедленно.
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);
}
}
}
});
}
Это работает для моего случая. Хотя вы можете видеть, как клавиатура появляется за доли секунды (что является уродливой частью), но я не могу придумать какой-либо другой способ заставить это работать во время написания. Если у вас есть лучшее решение, пожалуйста, оставьте комментарий!
Дайте мне знать, если это сэкономит кому-то время:)
Чтобы отключить отображение программной клавиатуры, сохраняя функции копирования / вставки и курсора, просто добавьте эту строку в свою деятельность:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM,
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Чтобы отключить автоматическое всплывающее окно клавиатуры системы для 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
}
Поскольку текущий верхний ответ использует устаревший метод и у меня не было метода вставки, вот еще один способ, который не использует старые методы. Но он пытается использовать скрытый метод через отражение с запасным вариантом. знак равно
Я подкласс EditText
в новый виджет под названием KeyboardlessEditText
он по-прежнему сохраняет все классные функции редактирования без отображения клавиатуры. Просто закинь файл и иди.
Полный код немного длинен для этого поста, но пока GitHub не работает, это будет работать: https://github.com/danialgoodwin/android-widget-keyboardless-edittext/blob/master/KeyboardlessEditText2.java
У меня была такая же проблема, но я также хотел позже разрешить ввод после нажатия doulbe... через несколько часов я нашел рабочее решение (по крайней мере, для меня). Используйте это в своем методе onCreate:
editText.setCursorVisible(false);
editText.setTextIsSelectable(true);
editText.setShowSoftInputOnFocus(false);
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // This just hide keyboard when activity starts
Эти строки определенно должны помочь... и если вы хотите отменить это, используйте это:
editText.setCursorVisible(true);
editText.setShowSoftInputOnFocus(true);
Чтобы снова показать клавиатуру, используйте:
private void showSoftKeyboard(View view) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
view.requestFocus();
inputMethodManager.showSoftInput(view, 0);
}
Чтобы разрешить копирование / вставку в следующий раз, просто используйте эти три строки:
editText.setCursorVisible(false);
editText.setTextIsSelectable(true);
editText.setShowSoftInputOnFocus(false);
Для дальнейшего скрытия клавиатуры используйте:
private void hideSoftKeyboard() {
if(getCurrentFocus() != null) {
InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
Этот код работает с API >= 21. Надеюсь, это кому-то поможет.
Попробуй это
EditText et = ... // your EditText
et.setKeyListener(null) //makes the EditText non-editable so, it acts like a TextView.
Нет необходимости в подклассе. Основное различие между этим и тем, что ваш EditText не фокусируется, состоит в том, что у EditText все еще есть свой собственный курсор - вы можете выбирать текст и т. Д. Все, что он делает, это запрещает IME выскакивать его собственной программной клавиатуры.
Была аналогичная потребность из-за моего пользовательского встроенного "фальшивого" ввода, который все еще был виден, поскольку программная клавиатура ОС появлялась после перемещения фокуса на текст редактирования. Решением было заставить текст редактирования скрывать программный ввод до тех пор, пока предыдущий пользовательский виджет ввода не завершил жизненный цикл редактирования.
Использовал ответ @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?