Dwa problemy z tym… jeden to fakt, że myEditText musi być ostateczna. Po drugie, muszę wiedzieć, które pole EditText jest aktywne. Jakieś rozwiązanie tego?
Ethan Allen,
78
Dla każdego, kto się tutaj potknie, możesz użyć aktywności (aktywności, w której jesteś, lub fragmentów 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.
Drake Clarris
2
Ta odpowiedź, w połączeniu z komentarzem tutaj, całkowicie rozwiązała mój problem!
aveschini
9
Co za brzydkie, brzydkie podejście do odrzucenia klawiatury. Mam nadzieję, że w przyszłości będzie łatwiejszy sposób na zrobienie tak prostej rzeczy.
Subby
73
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ę:
privatevoid 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
user1506104
Dobre rozwiązanie ... w rzadkich przypadkach isAcceptingText () może zwrócić false, gdy klawiatura jest nadal na ekranie, na przykład kliknij poza przyciskiem EditText na tekst, który można zaznaczyć, ale nie edytować w tym samym oknie.
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 )asInputMethodManagerif( inputMethodManager.isAcceptingText )
inputMethodManager.hideSoftInputFromWindow(this.currentFocus.windowToken,/*flags:*/0)}
Następnie po prostu skonsumuj, używając:
// from activitythis.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:
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)asInputMethodManager}
val windowHeightMethod =InputMethodManager::class.java.getMethod("getInputMethodWindowVisibleHeight")
val height = windowHeightMethod.invoke(imm)asIntif(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)asInputMethodManager}/**
* Dismiss soft input (keyboard) from the window using a [View] context.
*/
fun View.dismissKeyboard()= context
.getInputMethodManager().hideSoftInputFromWindow(
windowToken
,0)
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
źródło
getActivity()
)getCurrentFocus().getWindowToken()
jako pierwszej argumentacjihideSoftInputFromWindow()
. 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ę:
źródło
isAcceptingText()
uczynił tę odpowiedź lepszą niż inniTo jest moje rozwiązanie
źródło
Możesz również użyć tego kodu w przypadku kliknięcia przycisku
źródło
Oto rozwiązanie Kotlin (mieszanie różnych odpowiedzi w wątku)
Utwórz funkcję rozszerzającą (być może we wspólnej klasie ViewHelpers)
Następnie po prostu skonsumuj, używając:
źródło
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:
źródło
źródło
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.
źródło
Korzystając z kontekstu widoku, możemy osiągnąć pożądany efekt za pomocą następujących metod rozszerzających w Kotlinie:
Gdy już to zrobisz, zadzwoń:
źródło