Як відмовитись від клавіатури при натисканні кнопки?
Як відмовитись від клавіатури при натисканні кнопки?
Відповіді:
Ви хочете відключити або відхилити віртуальну клавіатуру?
Якщо ви хочете просто відхилити його, ви можете використовувати наступні рядки коду у вашій кнопці, натиснувши кнопку "Подія"
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
getActivity()) getCurrentFocus().getWindowToken()для першого аргументу hideSoftInputFromWindow(). Крім того, зробіть це в, onPause()а не в тому onStop()випадку, якщо ви намагаєтесь змусити його піти під час зміни діяльності.
Наведене вище рішення працює не для всіх пристроїв, і тим більше, що він використовує 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);
}
}
isAcceptingText()зробили цю відповідь краще за інших
Це моє рішення
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);
}
}
Ось рішення Котліна (змішування різних відповідей у потоці)
Створіть функцію розширення (можливо, у загальному класі 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.
@Ethan Allen, мені не потрібно було редагувати текст остаточним. Можливо, ви використовуєте внутрішній клас EditText, який ви оголосили методом, що містить? Ви можете зробити EditText змінною класу Діяльності. Або просто оголосіть новий 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)
}
}
Використовуючи контекст подання, ми можемо досягти бажаного результату за допомогою наступних методів розширення в Котліні:
/**
* 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()