Tastiera per Android


147

Come posso chiudere la tastiera quando si preme un pulsante?


Make a EditText Focusable = False fa il lavoro. Vuoi disabilitarlo completamente?
via

Risposte:


325

Vuoi disabilitare o eliminare una tastiera virtuale?

Se vuoi semplicemente scartarlo, puoi usare le seguenti righe di codice nel tuo pulsante quando fai clic su Evento

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

1
Due problemi con questo ... uno è che myEditText deve essere Final. Il secondo è che devo sapere quale casella EditText ha lo scopo. Qualche soluzione a questo?
Ethan Allen,

78
Per chiunque altro inciampi qui, puoi usare l'attività (o l'attività in cui ti trovi o i frammenti getActivity()) getCurrentFocus().getWindowToken()per il primo argomento hideSoftInputFromWindow(). Inoltre, fallo nel onPause()e non nel onStop()caso tu stia cercando di farlo sparire quando cambi attività.
Drake Clarris,

2
Questa risposta, combinata con il commento qui, ha risolto totalmente il mio problema!
aveschini,

9
Che brutto, brutto approccio per scartare una tastiera. Spero che ci sia un modo più pulito in futuro per fare una cosa così semplice.
Subby,

73

La soluzione sopra non funziona per tutti i dispositivi e inoltre utilizza EditText come parametro. Questa è la mia soluzione, basta chiamare questo semplice metodo:

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);
    }
}

3
isAcceptingText()ha reso questa risposta migliore di altre
user1506104

Buona soluzione ... in rari casi isAcceptingText () può restituire false quando la tastiera è ancora sullo schermo, ad esempio fare clic lontano da EditText per il testo che può essere selezionato ma non modificato nella stessa finestra.
Georgie,

29

Questa è la mia soluzione

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);
    }
}

Cioè se conosci la vista che ha mostrato la tastiera.
RPM

16

è inoltre possibile utilizzare questo codice all'evento clic pulsante

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

13

Ecco una soluzione Kotlin (mescolando le varie risposte nel thread)

Creare una funzione di estensione (forse in una classe ViewHelpers comune)

fun Activity.dismissKeyboard() {
    val inputMethodManager = getSystemService( Context.INPUT_METHOD_SERVICE ) as InputMethodManager
    if( inputMethodManager.isAcceptingText )
        inputMethodManager.hideSoftInputFromWindow( this.currentFocus.windowToken, /*flags:*/ 0)
}

Quindi consuma semplicemente usando:

// from activity
this.dismissKeyboard()

// from fragment
activity.dismissKeyboard()

5

La prima soluzione con InputMethodManager ha funzionato come un campione per me, il metodo getWindow (). SetSoftInputMode non su Android 4.0.3 HTC Amaze.

@Ethan Allen, non avevo bisogno di rendere definitivo il testo di modifica. Forse stai usando una classe interna EditText che hai dichiarato il metodo di contenimento? È possibile rendere EditText una variabile di classe dell'attività. O semplicemente dichiarare un nuovo EditText all'interno della classe / metodo interno e utilizzare di nuovo findViewById (). Inoltre, non ho trovato che avevo bisogno di sapere quale EditText nel modulo era attivo. Potrei semplicemente sceglierne uno arbitrariamente e usarlo. Così:

    EditText myEditText= (EditText) findViewById(R.id.anyEditTextInForm);  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

3
Benvenuto in Stack Overflow! Questo è davvero un commento, non una risposta. Con un po 'più di rappresentante, sarai in grado di pubblicare commenti .
Jack,

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

1

Questa soluzione si assicura che nasconda anche la tastiera non fa nulla se non viene aperta. Utilizza l'estensione in modo che possa essere utilizzato da qualsiasi classe di proprietario del contesto.


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)
    }
}


0

Utilizzando il contesto della vista, possiamo ottenere il risultato desiderato con i seguenti metodi di estensione in 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
        )

Una volta che questi sono a posto, basta chiamare:

editTextFoo.dismiss()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.