Android: comment faire en sorte que le bouton d'entrée du clavier dise «Rechercher» et gérer son clic?


373

Je ne peux pas comprendre cela. Certaines applications ont un EditText (zone de texte) qui, lorsque vous le touchez et fait apparaître le clavier à l'écran, le clavier a un bouton "Rechercher" au lieu d'une touche d'entrée.

Je veux mettre cela en œuvre. Comment puis-je implémenter ce bouton Rechercher et détecter la pression du bouton Rechercher?

Modifier : a trouvé comment implémenter le bouton Rechercher; en XML, android:imeOptions="actionSearch"ou en Java, EditTextSample.setImeOptions(EditorInfo.IME_ACTION_SEARCH);. Mais comment gérer l'utilisateur en appuyant sur ce bouton Rechercher? Cela a-t-il quelque chose à voir android:imeActionId?


3
Notez que imeOptions peut ne pas fonctionner sur certains appareils. Voir ceci et cela .
Ermolai

Réponses:


905

Dans la mise en page, définissez vos options de méthode de saisie pour la recherche.

<EditText
    android:imeOptions="actionSearch" 
    android:inputType="text" />

Dans la java, ajoutez l'écouteur d'action de l'éditeur.

editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            performSearch();
            return true;
        }
        return false;
    }
});

82
Sur os 2.3.6, cela ne fonctionne que lorsque je mets l'attribut android: inputType = "text".
thanhbinh84

41
android: inputType = "text" était également requis pour moi sur Android 2.3.5 et 4.0.4
ccyrille

6
@Carol EditTextest une sous-classe de TextView.
howettl

13
android: inputType = "text" est également requis pour 4.4.0 - 4.4.2 (Android Kitkat).
user818455

12
Ouaip, Android: inputType = "text" est toujours nécessaire dans la version 5.0 :)
lionelmessi

19

Masquer le clavier lorsque l'utilisateur clique sur Rechercher. Ajout à la réponse de Robby Pond

private void performSearch() {
    editText.clearFocus();
    InputMethodManager in = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
    //...perform search
}

8

Dans le xmlfichier, mis imeOptions="actionSearch"et inputType="text", maxLines="1":

<EditText
    android:id="@+id/search_box"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search"
    android:imeOptions="actionSearch"
    android:inputType="text"
    android:maxLines="1" />

5

À Kotlin

evLoginPassword.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_DONE) {
        doTheLoginWork()
    }
    true
}

Code XML partiel

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
       <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:paddingLeft="24dp"
            android:paddingRight="24dp">

            <EditText
                android:id="@+id/evLoginUserEmail"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/email"
                android:inputType="textEmailAddress"
                android:textColor="@color/black_54_percent" />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginTop="8dp"
            android:paddingLeft="24dp"
            android:paddingRight="24dp">

            <EditText
                android:id="@+id/evLoginPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/password"
                android:inputType="textPassword"
                android:imeOptions="actionDone"
                android:textColor="@color/black_54_percent" />
        </android.support.design.widget.TextInputLayout>
</LinearLayout>

1

Cette réponse est pour TextInputEditText:

Dans le fichier XML de mise en page, définissez vos options de méthode de saisie sur le type requis. par exemple fait .

<com.google.android.material.textfield.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionGo"/>

De même, vous pouvez également définir imeOptions sur actionSubmit, actionSearch, etc.

Dans la java, ajoutez l'écouteur d'action de l'éditeur.

textInputLayout.getEditText().setOnEditorActionListener(new 

    TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_GO) {
                performYourAction();
                return true;
            }
            return false;
        }
    });

Si vous utilisez kotlin:

textInputLayout.editText.setOnEditorActionListener { _, actionId, _ ->
    if (actionId == EditorInfo.IME_ACTION_GO) {
        performYourAction()
    }
    true
}

0

par XML:

 <EditText
        android:id="@+id/search_edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/search"
        android:imeOptions="actionSearch"
        android:inputType="text" />

Par Java:

 editText.clearFocus();
    InputMethodManager in = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    in.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.