2010-08-24 20 views

Odpowiedz

283

Chcesz wyłączyć lub odrzucić wirtualną klawiaturę?

Jeśli chcesz po prostu odrzucić go można użyć następujących linii kodu w swoim Buttona na zdarzenie click

InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0); 
+1

+1. Działa jak urok. –

+1

Dwa problemy z tym ... jednym z nich jest to, że myEditText musi być Final. Po drugie, muszę wiedzieć, na którym polu EditText się koncentruję. Jakieś rozwiązanie tego? –

+66

Dla każdego, kto się tutaj potknie, możesz użyć działania (zarówno aktywności, w której się znajdujesz, jak i fragmentów 'getActivity()') 'getCurrentFocus(). GetWindowToken()' dla pierwszego argumentu 'hideSoftInputFromWindow()'. Zrób to również w 'onPause()', a nie 'onStop()' jeśli próbujesz zmusić go do odejścia podczas zmiany czynności. –

13

można również użyć tego kodu w przycisk kliknij zdarzenie

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
+0

Ta metoda była dla mnie jedyna, dzięki! – Emilio

+11

Hmm. To dla mnie nie działa. – tomwhipple

+0

Nie działa dla mnie ani na API 23 –

5

Pierwsze rozwiązanie z InputMethodManager działało jak mistrz dla mnie, metoda getWindow(). setSoftInputMode nie działa na Androidzie 4.0.3 HTC Amaze.

@Ethan Allen, nie musiałem robić ostatecznego tekstu edycji. Może używasz wewnętrznej klasy EditText, którą zadeklarowałeś jako metodę zawierającą? Możesz przekształcić EditText w zmienną klasy działania. Lub po prostu zadeklaruj nowy EditText wewnątrz wewnętrznej klasy/metody i ponownie użyj findViewById(). Ponadto nie stwierdziłem, że muszę wiedzieć, który EditText w formularzu się skupił. Mogę wybrać dowolnie i użyć go. Podobnie jak:

+3

Witamy w Stack Overflow! To naprawdę komentarz, a nie odpowiedź. Przy odrobinie więcej powtórzeń [będziesz mógł dodawać komentarze] (http://stackoverflow.com/privileges/comment). – Jack

+2

To jest poprawna odpowiedź. Dzięki Andy! –

50

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 zadzwoń 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); 
    } 
} 
+1

fantastyczny punkt, dzięki – Fattie

+2

'isAcceptingText()' zrobił tę odpowiedź lepiej niż inni – user1506104

22

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); 
    } 
} 
4
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(); 
    } 
} 
3

Oto rozwiązanie Kotlin (mieszanie różnych odpowiedzi w wątku)

Utwórz funkcja rozszerzenia (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) 
} 

Wtedy po prostu zużywają przy użyciu:

// from activity 
this.dismissKeyboard() 

// from fragment 
activity.dismissKeyboard() 
Powiązane problemy