Android отклонить клавиатуру
Как убрать клавиатуру при нажатии кнопки?
11 ответов
Вы хотите отключить или закрыть виртуальную клавиатуру?
Если вы хотите просто отклонить его, вы можете использовать следующие строки кода в кнопке при нажатии кнопки "Событие".
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
Приведенное выше решение не работает для всех устройств и, кроме того, оно использует EditText в качестве параметра. Это мое решение, просто вызовите этот простой метод:
private void hideSoftKeyBoard() {
InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
if(imm.isAcceptingText()) { // verify if the soft keyboard is open
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
}
}
Это мое решение
public static void hideKeyboard(Activity activity) {
View v = activity.getWindow().getCurrentFocus();
if (v != null) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
Вы также можете использовать этот код на событие нажатия кнопки
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
Вот решение Kotlin (смешивая различные ответы в теме)
Создать функцию расширения (возможно, в обычном классе ViewHelpers)
fun Activity.dismissKeyboard() {
val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
if( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}
Тогда просто потребляйте используя:
// from activity
this.dismissKeyboard()
// from fragment
activity.dismissKeyboard()
Первое решение с InputMethodManager работало для меня как победитель, метод getWindow(). SetSoftInputMode не работал на Android 4.0.3 HTC Amaze.
@ Итан Аллен, мне не нужно было окончательно редактировать текст. Может быть, вы используете внутренний класс EditText, который вы объявили содержащий метод? Вы можете сделать EditText переменной класса Activity. Или просто объявите новый EditText во внутреннем классе / методе и снова используйте findViewById(). Кроме того, я не нашел, что мне нужно было знать, какой EditText в форме был в фокусе. Я мог бы просто выбрать один произвольно и использовать его. Вот так:
EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
public static void hideSoftInput(Activity activity) {
try {
if (activity == null || activity.isFinishing()) return;
Window window = activity.getWindow();
if (window == null) return;
View view = window.getCurrentFocus();
//give decorView a chance
if (view == null) view = window.getDecorView();
if (view == null) return;
InputMethodManager imm = (InputMethodManager) activity.getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm == null || !imm.isActive()) return;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
} catch (Throwable e) {
e.printStackTrace();
}
}
Это решение убедитесь, что оно скрывает клавиатуру, и ничего не делает, если она не открыта. Он использует расширение, поэтому его можно использовать из любого класса владельца контекста.
fun Context.dismissKeyboard() {
val imm by lazy { this.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager }
val windowHeightMethod = InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm) as Int
if (height > 0) {
imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0)
}
}
некоторые правки в вышеуказанных решениях и работали
private void hideSoftKeyBoard() {
InputMethodManager imm = (InputMethodManager) getContext().getSystemService(INPUT_METHOD_SERVICE);
if (imm.isAcceptingText()) { // verify if the soft keyboard is open
imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
}
}
Используя контекст представления, мы можем достичь желаемого результата с помощью следующих методов расширения в Kotlin:
/**
* Get the [InputMethodManager] using some [Context].
*/
fun Context.getInputMethodManager(): InputMethodManager {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return getSystemService(InputMethodManager::class.java)
}
return getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
}
/**
* Dismiss soft input (keyboard) from the window using a [View] context.
*/
fun View.dismissKeyboard() = context
.getInputMethodManager()
.hideSoftInputFromWindow(
windowToken
, 0
)
Как только они на месте, просто позвоните:
editTextFoo.dismiss()
Котлин:
Чтобы отключить клавиатуру, вызовите
clearFocus()
на соответствующем элементе при нажатии кнопки.
Пример:
mSearchView.clearFocus()