Jak zamknąć klawiaturę po naciśnięciu przycisku?
Jak zamknąć klawiaturę po naciśnięciu przycisku?
Odpowiedzi:
Chcesz wyłączyć lub odrzucić wirtualną klawiaturę?
Jeśli chcesz go po prostu odrzucić, możesz użyć następujących wierszy kodu w zdarzeniu przycisku po kliknięciu
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);
getActivity()) getCurrentFocus().getWindowToken()jako pierwszej argumentacji hideSoftInputFromWindow(). Rób to także w trybie, onPause()a nie, onStop()jeśli chcesz, aby to zniknęło podczas zmiany czynności.
Powyższe rozwiązanie nie działa dla wszystkich urządzeń, a ponadto używa EditText jako parametru. To jest moje rozwiązanie, po prostu wywołaj tę prostą metodę:
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()uczynił tę odpowiedź lepszą niż inni
To jest moje rozwiązanie
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);
}
}
Oto rozwiązanie Kotlin (mieszanie różnych odpowiedzi w wątku)
Utwórz funkcję rozszerzającą (być może we wspólnej klasie ViewHelpers)
fun Activity.dismissKeyboard() {
val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
if( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}
Następnie po prostu skonsumuj, używając:
// from activity
this.dismissKeyboard()
// from fragment
activity.dismissKeyboard()
Pierwsze rozwiązanie z InputMethodManager działało jak mistrz dla mnie, metoda getWindow (). SetSoftInputMode nie działała na Androidzie 4.0.3 HTC Amaze.
@Ethan Allen, nie musiałem kończyć edycji tekstu. Może używasz klasy wewnętrznej EditText, w której zadeklarowałeś metodę zawierającą? Możesz uczynić EditText zmienną klasy działania. Lub po prostu zadeklaruj nowy EditText w wewnętrznej klasie / metodzie i ponownie użyj findViewById (). Ponadto nie stwierdziłem, że muszę wiedzieć, który tekst EditText w formularzu był aktywny. Mógłbym po prostu wybrać dowolnie jeden i użyć go. Tak jak to:
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();
}
}
To rozwiązanie upewnij się, że ukrywa klawiaturę, a także nic nie rób, jeśli nie zostanie otwarta. Używa rozszerzenia, więc może być używany z dowolnej klasy właściciela kontekstu.
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)
}
}
Korzystając z kontekstu widoku, możemy osiągnąć pożądany efekt za pomocą następujących metod rozszerzających w Kotlinie:
/**
* 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
)
Gdy już to zrobisz, zadzwoń:
editTextFoo.dismiss()