Comment créer un bouton "Terminé" d'Android EditView et masquer le clavier lorsque l'utilisateur clique dessus?

115

Lorsque l'utilisateur clique sur le EditView, Android ouvre le clavier afin que l'utilisateur puisse écrire dans le EditView.

Le problème est que lorsque l'utilisateur a fini d'écrire, il n'y a aucun moyen de masquer le clavier. L'utilisateur doit appuyer sur le bouton retour pour masquer le clavier.

Existe-t-il un moyen d'afficher un Donebouton sur le clavier qui masquera le clavier?

d-man
la source

Réponses:

140

Utilisez TextView.setImeOptions et transmettez-le actionDone. commetextView.setImeOptions(EditorInfo.IME_ACTION_DONE);

dmazzoni
la source
8
textView.setImeOptions(EditorInfo.IME_ACTION_DONE);
sulai
14
J'ai dû ajouter textView.singleLine(true)pour que cela fonctionne par programme.
Jacksonkr
mais cela est obsolète depuis Android 2.3
Sumit Kumar Saha
148

Vous devez d'abord définir l' android:imeOptionsattribut égal à actionDonepour votre EditText cible comme indiqué ci-dessous. Cela changera votre bouton 'RETURN' dans le clavier virtuel de votre EditText en un bouton 'DONE'.

<EditText 
    android:id="@+id/edittext_done"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="Enter some text"
    android:imeOptions="actionDone"
    />
Paresh Mayani
la source
@Michael a supprimé ce lien. Merci
Paresh Mayani
19
J'ai dû ajouter android:singleLine="true"pour que cela fonctionne via xml
Jacksonkr
4
android: singleLine est obsolète. Utilisez android: maxLines = "1".
FariborZ
Oui, @FariborZ singleLine est désormais obsolète.
Paresh Mayani
1
Remarque importante: singleLine n'est pas la même chose que maxLines. Cette idée fausse cause beaucoup de problèmes pour tout le monde, nous devons le noter partout. stackoverflow.com/questions/30879471/…
milosmns
86

Incluez à la fois imeOptions et singleLine :

<EditText 
   android:id="@+id/edittext_done"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:imeOptions="actionDone"
   android:singleLine="true"
   />
Oded Breiner
la source
35
android:imeActionLabel="Done" 
android:singleLine="true"

Dans le fichier XML fonctionne très bien. Mais cela amènera également le editTextà continuer à taper sur une seule ligne, ce que vous ne voudrez peut-être pas. Donc, ajouter le suivi à votre code vous assurera que vous ne finirez pas par tout taper sur une seule ligne.

mainText.setHorizontallyScrolling(false);
mainText.setMaxLines("Maximum integer value that you want to provide");
Santosh Pillai
la source
1
Merci, la démo était le 12, l'heure était 11:58 et vous avez résolu mon problème le 11:59: p
shahzain ali
android: singleLine = "true" est obsolète. Alors utilisez, android: lines = "1"
Gowtham. R
20

Pour obtenir le bouton Terminé

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);

et

android:inputType="text" dans le xml

Pour la manipulation après avoir cliqué sur le clavier

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

»

Shangeeth Sivan
la source
14

Utilisez ceci:

android:singleLine="true"
Frank Nguyen
la source
Oui ... sinon comment va-t-on distinguer le passage à la ligne suivante de la fermeture du clavier?
jstewart379
C'est ce qui a fonctionné pour moi. J'ai décidé de me tromper actionDoneen y ayant également, juste au cas où certains appareils réagiraient différemment.
Jacksonkr
10

Utilisez ces deux lignes pour votre EditText

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

ou vous pouvez le réaliser par programmation par cette ligne.

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
NarenderNishad
la source
7

Si la propriété ne change pas pour le widget, il peut être préférable de l'utiliser comme android:imeOptions="actionDone"dans le xmlfichier de mise en page .

À M
la source
6

Utilisation:

android:imeActionLabel="Done"
android:singleLine="true" 
Kiran Mahale
la source
5

Pour le code:

editText.setImeOptions(EditorInfo.IME_ACTION_DONE);
Steven.Nguyen
la source
5

ActionDone est utilisé lorsque vous cliquez sur le bouton suivant du clavier pendant lequel le clavier est masqué.Utiliser dans Modifier le texte ou AppcompatEdit

XML

1.1 Si vous utilisez 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 Si vous utilisez Edittext

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

JAVA

EditText edittext= (EditText) findViewById(R.id.edittext);
edittext.setImeOptions(EditorInfo.IME_ACTION_DONE);
Raj
la source
5

Je dois le souligner, car beaucoup de gens peuvent lutter sans connaître le problème.

Si vous voulez que le kb se masque lorsque vous cliquez Done, et que vous définissez android:imeOptions="actionDone"et android:maxLines="1" sans définir votre EditText, inputTypecela ne fonctionnera PAS par défaut inputTypepour EditText, ce n'est pas ce "text"que beaucoup de gens pensent.

donc, la mise ne inputTypevous donnera les résultats que vous désirez tout ce que vous définissez comme à "text", "number"... etc.

Muhammed Refaat
la source
2

En fait, vous pouvez définir un texte personnalisé sur ce petit bouton bleu. Dans le fichier xml, utilisez simplement

android:imeActionLabel="whatever"

sur votre EditText.

Ou dans l'utilisation du fichier java

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

Je choisis arbitrairement IME_ACTION_DONE comme exemple de ce qui devrait figurer dans le deuxième paramètre de cette fonction. Une liste complète de ces actions est disponible ici .

Il convient de noter que cela ne fera pas apparaître le texte sur tous les claviers de tous les appareils. Certains claviers ne prennent pas en charge le texte sur ce bouton (par exemple, Swiftkey). Et certains appareils ne le prennent pas en charge non plus. Une bonne règle est que si vous voyez déjà du texte sur le bouton, cela le changera en ce que vous voulez.

Zar E Ahmer
la source
2

Solution Kotlin

Le moyen direct de gérer le clavier masquer + l'action terminée dans Kotlin est:

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

Extension Kotlin

Utilisez ceci pour appeler edittext.onDone {/*action*/}votre code principal. Le rend plus lisible et maintenable

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

Extensions de clavier supplémentaires

Si vous souhaitez plus de façons de simplifier le travail avec le clavier (afficher, fermer, se concentrer): Lisez cet article

N'oubliez pas d'ajouter ces options à votre edittext Xml, sinon dans le code

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

Besoin d' inputType="textMultiLine"aide? Lisez cet article et n'ajoutez pas imeOptionsou inputTypeen Xml

Gibolt
la source
0

utilisez ceci à votre avis

<EditText 
    ....
    ....
    android:imeOptions="actionDone" 
    android:id="@+id/edtName"
    />
Marium Jawed
la source
0

Si vous utilisez

android:imeOptions="actionDone" 

alors vous devez utiliser

android:inputType="text"

alors seulement vous pouvez voir le bouton Action Done dans le clavier.

Aditya Patil
la source
0

Si vous ne voulez pas du tout de bouton (par exemple, vous développez une interface graphique pour les personnes aveugles où le tap ne peut pas être positionnel et vous comptez sur des taps simples / doubles / longs):

text.setItemOptions(EditorInfo.IME_ACTION_NONE)

Ou à Kotlin:

text.imeOptions = EditorInfo.IME_ACTION_NONE
albaspazio
la source