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?

Ricket
la source
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;
    }
});
Robby Pond
la source
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
}
kaMChy
la source
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" />
Braj Bhushan Singh
la source
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>
Shaon
la source
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
}
iAmSauravSharan
la source
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);
Exception de pointeur nul
la source