408 votes

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

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

Je veux mettre en œuvre ce système. Comment puis-je mettre en œuvre ce bouton de recherche et détecter l'appui sur le bouton de recherche ?

Modifier J'ai trouvé comment implémenter le bouton de recherche ; en XML, android:imeOptions="actionSearch" ou en Java, EditTextSample.setImeOptions(EditorInfo.IME_ACTION_SEARCH); . Mais comment dois-je gérer le fait que l'utilisateur appuie sur ce bouton de recherche ? Est-ce que cela a quelque chose à voir avec android:imeActionId ?

3 votes

Notez que imeOptions peut ne pas fonctionner sur certains appareils. Voir ce et ce .

985voto

Robby Pond Points 37875

Dans la mise en page, définissez vos options de méthode d'entrée sur 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;
    }
});

0 votes

Que faire si nous voulons obtenir les clés sur lesquelles l'utilisateur clique, comme a,b,c ?

86 votes

Sous OS 2.3.6, cela ne fonctionne pas tant que je n'ai pas mis l'attribut Android:inputType="text".

0 votes

Ces deux TextView ne devraient-ils pas plutôt dire EditText ?

27voto

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

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

10voto

Shaon Points 225

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

9voto

Sur xml mettre 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" />

1voto

iAmSauravSharan Points 15

Cette réponse est pour TextInputEditText :

Dans le fichier XML de mise en page, définissez les options de la méthode d'entrée en fonction du type requis, par exemple fait .

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/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"/>

</com.google.Android.material.textfield.TextInputLayout>

De la même manière, vous pouvez également définir des imeOptions pour actionSubmit, actionSearch, etc.

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

TextInputLayout textInputLayout = findViewById(R.id.textInputLayout);

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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X