Come faccio a creare un pulsante "Fine" di Android EditView e nascondere la tastiera quando si fa clic?


115

Quando l'utente fa clic su EditView, Android apre la tastiera in modo che l'utente possa scrivere nel file EditView.

Il problema è che quando l'utente ha finito di scrivere, non c'è modo di nascondere la tastiera. L'utente deve premere il pulsante Indietro per nascondere la tastiera.

C'è un modo per visualizzare un Donepulsante sulla tastiera che nasconderà la tastiera?


Risposte:



148

Per prima cosa devi impostare l' android:imeOptionsattributo uguale a actionDoneper il tuo EditText di destinazione come mostrato di seguito. Ciò cambierà il tuo pulsante "RETURN" nella tastiera virtuale di EditText in un pulsante "FATTO".

<EditText 
    android:id="@+id/edittext_done"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Enter some text"
    android:imeOptions="actionDone"
    />

@Michael ha rimosso quel collegamento. Grazie
Paresh Mayani

19
Ho dovuto aggiungere android:singleLine="true"per farlo funzionare tramite xml
Jacksonkr

4
android: singleLine è deprecato. Usa android: maxLines = "1".
FariborZ

Sì @FariborZ singleLine è ora deprecato.
Paresh Mayani

1
Nota importante: singleLine non è uguale a maxLines. Questo malinteso causa molti problemi a tutti, dobbiamo notarlo ovunque. stackoverflow.com/questions/30879471/...
milosmns

86

Includere sia imeOptions e singleLine :

<EditText 
   android:id="@+id/edittext_done"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionDone"
   android:singleLine="true"
   />

35
android:imeActionLabel="Done" 
android:singleLine="true"

Nel file XML funziona bene. Ma questo farà sì editTextche continui a digitare su una singola riga che potresti non volere. Quindi aggiungendo quanto segue al tuo codice ti assicurerai che non finirai per digitare tutto su una singola riga.

mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");

1
Grazie, la demo era il 12, l'ora era 11:58 e hai risolto il mio problema l'11: 59: p
shahzain ali

android: singleLine = "true" è stato deprecato. Quindi usa, android: lines = "1"
Gowtham. R

20

Per aver finito Button

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

e

android:inputType="text" nel file xml

Per la gestione su fatto clic da tastiera

    editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event){
            if(actionId == EditorInfo.IME_ACTION_DONE){
                // Your action on done
                return true;
            }
            return false;
        }
    });

`


14

Usa questo:

android:singleLine="true"

Sì ... altrimenti come distinguere il passaggio alla riga successiva dalla chiusura della tastiera?
jstewart379

Questo è ciò che ha finito per funzionare per me. Ho deciso di sbagliare anche con l'avere actionDonelì dentro, nel caso in cui alcuni dispositivi reagissero diversamente.
Jacksonkr

10

Usa queste due righe per il tuo file EditText

android:imeActionLabel="Done"
android:singleLine="true"

oppure puoi ottenerlo a livello di programmazione da questa riga.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

7

Se la proprietà non cambia per il widget, potrebbe essere meglio usare come android:imeOptions="actionDone"nel xmlfile di layout .




5

ActionDone viene utilizzato quando si fa clic sul pulsante successivo della tastiera quando la tastiera è nascosta.

XML

1.1 Se usi AppCompatEdittext

    <android.support.v7.widget.AppCompatEditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"/>

1.2 Se usi Edittext

    <EditText
    android:id="@+id/edittext"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:imeOptions="actionDone"/>

GIAVA

EditText edittext= (EditText) findViewById(R.id.edittext);
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);

5

Devo sottolineare che molte persone possono lottare in questo senza conoscere il problema.

Se vuoi che il kb si nasconda quando Donefai clic , e imposti android:imeOptions="actionDone"& android:maxLines="1" senza impostare il tuo EditText inputType, NON funzionerà poiché l'impostazione predefinita inputTypeper l'EditText non è "text"come molti pensano.

così, l'impostazione solo inputTypevi darà i risultati che desideri qualunque cosa si sta configurando a come "text", "number", ... ecc.


2

In realtà puoi impostare il testo personalizzato su quel piccolo pulsante blu. Nel file xml usa solo

android:imeActionLabel="whatever"

sul tuo EditText.

O nel file java usa

etEditText.setImeActionLabel("whatever", EditorInfo.IME_ACTION_DONE);

Scelgo arbitrariamente IME_ACTION_DONE come esempio di cosa dovrebbe andare nel secondo parametro per questa funzione. Un elenco completo di queste azioni può essere trovato qui .

Va notato che ciò non farà apparire il testo su tutte le tastiere su tutti i dispositivi. Alcune tastiere non supportano il testo su quel pulsante (ad esempio swiftkey). E nemmeno alcuni dispositivi lo supportano. Una buona regola è che, se vedi del testo già sul pulsante, questo lo cambierà in quello che desideri.


2

Soluzione Kotlin

Il modo diretto per gestire la tastiera nascosta + l'azione eseguita in Kotlin è:

// Set action
edittext.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        // Hide Keyboard
        val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
        true
    }
    false
}

Estensione Kotlin

Usalo per chiamare il edittext.onDone {/*action*/}tuo codice principale. Mantiene più leggibile e gestibile

edittext.onDone { edittext.hideKeyboard() }

fun View.hideKeyboard() {
    val inputMethodManager = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

fun EditText.onDone(callback: () -> Unit) {
    // These lines optional if you don't want to set in Xml
    imeOptions = EditorInfo.IME_ACTION_DONE
    maxLines = 1
    setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
            callback.invoke()
            true
        }
        false
    }
}

Ulteriori estensioni della tastiera

Se desideri più modi per semplificare il lavoro con la tastiera (mostra, chiudi, mette a fuoco): leggi questo post

Non dimenticare di aggiungere queste opzioni al tuo Xml edittext, se non nel codice

<EditText ...
    android:imeOptions="actionDone"
    android:inputType="text"/>

Hai bisogno di inputType="textMultiLine"supporto? Leggi questo post e non aggiungere imeOptionso inputTypein Xml


0

usalo a tuo avviso

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />

0

Se stai usando

android:imeOptions="actionDone" 

allora devi usare

android:inputType="text"

solo tu puoi vedere il pulsante Azione completata nella tastiera.


0

Se non desideri alcun pulsante (ad esempio, stai sviluppando una GUI per non vedenti in cui il tocco non può essere posizionato e ti affidi a tocchi singoli / doppi / lunghi):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

O a Kotlin:

text.imeOptions = EditorInfo.IME_ACTION_NONE
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.