70 votes

Comment effacer un EditText au clic ?

Dans Android, comment puis-je créer un EditText s'efface quand on clique dessus ?

Par exemple, si j'ai un EditText avec quelques caractères, comme 'Enter Name' Lorsque l'utilisateur clique dessus, ces caractères disparaissent.

1 votes

Étape 1 : Ajouter un écouteur onClick à l'EditText Étape 2 : Dans l'écouteur, définir le contenu de l'EditText à une chaîne vide Étape 3 : Profit

2 votes

Gagnez du temps et lisez la réponse de Specur, qui devrait être la réponse acceptée ici. stackoverflow.com/a/4175442/360211

186voto

Specur Points 1787

Je ne sais pas si c'est ce que vous recherchez, mais essayez ce XML :

android:hint="Enter Name"

Il affiche ce texte lorsque le champ de saisie est vide, sélectionné ou non sélectionné.

Ou si vous voulez qu'il fasse exactement ce que vous avez décrit, attribuez un onClickListener à l'editText et définissez-le vide avec setText().

37voto

Harris Points 916

Cherchez-vous un comportement similaire au x qui apparaît sur le côté droit des champs de texte sur un iphone et qui efface le texte lorsqu'on le touche ? C'est ce que l'on appelle clearButtonMode. Voici comment créer cette même fonctionnalité dans une vue EditText Android :

String value = "";//any text you are pre-filling in the EditText

final EditText et = new EditText(this);
et.setText(value);
final Drawable x = getResources().getDrawable(R.drawable.presence_offline);//your x image, this one from standard android images looks pretty good actually
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
et.setCompoundDrawables(null, null, value.equals("") ? null : x, null);
et.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (et.getCompoundDrawables()[2] == null) {
            return false;
        }
        if (event.getAction() != MotionEvent.ACTION_UP) {
            return false;
        }
        if (event.getX() > et.getWidth() - et.getPaddingRight() - x.getIntrinsicWidth()) {
            et.setText("");
            et.setCompoundDrawables(null, null, null, null);
        }
        return false;
    }
});
et.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        et.setCompoundDrawables(null, null, et.getText().toString().equals("") ? null : x, null);
    }

    @Override
    public void afterTextChanged(Editable arg0) {
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }
});

1 votes

Et pour ma version de ce code qui met en œuvre toutes les différentes options du bouton d'effacement du champ de texte, regardez ici. stackoverflow.com/questions/6274021/

0 votes

C'est absolument génial. Si, comme moi, vous utilisez déjà un drawable composé (un glyphe de recherche à gauche du texte d'édition), il y a un peu d'édition nécessaire pour le supporter. J'ai posté une version de ceci comme une sous-classe de EditText, ci-dessous.

1 votes

Remarque : si votre icône est plus grande que l'EditText et que vous ne souhaitez pas que l'EditText soit constamment redimensionné lors des effacements ou de l'ajout de texte, définissez l'alpha des éléments à dessiner sur 0 ou 255, selon le cas.

28voto

TechEnd Points 3846

Après un clic sur une action, faites l'étape suivante

((EditText) findViewById(R.id.yoursXmlId)).setText("");

ou

écrire ceci dans un fichier XML

<EditText
---------- other stuffs ------ 
android:hint="Enter Name" /> 

Cela fonctionne bien pour moi. Je vous souhaite à tous une bonne continuation.

1 votes

La réponse la plus simple et la plus précise. Merci !

21voto

Yash Patil Points 249

Qui est appelé hint dans Android utiliser Android:hint="Entrez le nom"

19voto

Carlos P Points 1625

La réponse de @Harris est excellente, je l'ai implémentée comme une sous-classe séparée de EditText, ce qui peut la rendre plus facile à utiliser si votre code ajoute déjà des TextChangedListeners.

De plus, j'ai fait en sorte que, si vous utilisez déjà un dessin composé, il le laisse intact.

Le code est ici, pour ceux qui en ont besoin :

package com.companyname.your

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;

public class ClearableEditText extends EditText {

    public String defaultValue = "";
    final Drawable imgX = getResources().getDrawable(android.R.drawable.presence_offline ); // X image

    public ClearableEditText(Context context) {
        super(context);

        init();
    }

    public ClearableEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

        init();
    }

    public ClearableEditText(Context context, AttributeSet attrs) {
        super(context, attrs);

        init();
    }

    void init()  {

        // Set bounds of our X button
        imgX.setBounds(0, 0, imgX.getIntrinsicWidth(), imgX.getIntrinsicHeight());      

        // There may be initial text in the field, so we may need to display the button
        manageClearButton();

        this.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                ClearableEditText et = ClearableEditText.this;

                // Is there an X showing?
                if (et.getCompoundDrawables()[2] == null) return false;
                // Only do this for up touches
                if (event.getAction() != MotionEvent.ACTION_UP) return false;
                // Is touch on our clear button?
                if (event.getX() > et.getWidth() - et.getPaddingRight() - imgX.getIntrinsicWidth()) {
                    et.setText("");
                    ClearableEditText.this.removeClearButton();
                }
                return false;
            }
        });

        this.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

                ClearableEditText.this.manageClearButton();
            }

            @Override
            public void afterTextChanged(Editable arg0) {
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
        });
    }

    void manageClearButton() {
        if (this.getText().toString().equals("") )
            removeClearButton();
        else
            addClearButton();
    }
    void addClearButton() {
        this.setCompoundDrawables(this.getCompoundDrawables()[0], 
                this.getCompoundDrawables()[1],
                imgX,
                this.getCompoundDrawables()[3]);
    }
    void removeClearButton() {
        this.setCompoundDrawables(this.getCompoundDrawables()[0], 
                this.getCompoundDrawables()[1],
                null,
                this.getCompoundDrawables()[3]);
    }

}

1 votes

Dans OnTouchListener.onTouch(), vous devez renvoyer "true" lorsque vous effacez le champ. Cela indique que vous avez consommé l'événement, conformément à la spécification du OnTouchListener.

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