web-dev-qa-db-fra.com

Comment effacer un EditText sur un clic?

Sous Android, comment puis-je rendre une EditText claire quand on clique dessus?

Par exemple, si j'ai une EditText avec certains caractères, comme 'Enter Name', lorsque l'utilisateur clique dessus, ces caractères disparaissent.

66
Entropy1024

Je ne sais pas si vous êtes après cela, mais essayez ce code XML:

Android:hint="Enter Name"

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

Ou, si vous souhaitez que l'opération soit conforme à la description, affectez un onClickListener sur le editText et définissez-le vide avec setText ().

180
Specur

Cherchez-vous un comportement similaire au x qui apparaît à droite des champs de texte sur un iphone qui efface le texte lorsque vous appuyez dessus? C'est ce qu'on appelle clearButtonMode. Voici comment créer cette même fonctionnalité dans une vue Android EditText:

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) {
    }
});
37
Harris

après avoir cliqué sur une action, faites en-dessous de l'étape

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

ou

écrire ceci dans un fichier XML

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

ça marche bien pour moi. En espérant à tous.

27
Rahul Baradia

La réponse de @ Harris est excellente, je l'ai implémentée en tant que sous-classe distincte de EditText, ce qui peut en faciliter l'utilisation si votre code ajoute déjà TextChangedListeners.

De plus, je l'ai modifié pour que, si vous utilisez déjà des Composables Drawables, ceux-ci restent intacts.

Le code est là, pour tous 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]);
    }

}
19
Carlos P

cela s'appelle indice dans Android utiliser Android: hint = "Entrer le nom"

18
Yash Patil

Si vous voulez avoir du texte dans le texte à éditer et le supprimer comme vous le dites, essayez:

    final EditText text_box = (EditText) findViewById(R.id.input_box);
    text_box.setOnFocusChangeListener(new OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View v, boolean hasFocus) 
        {
            if (hasFocus==true)
            {
                if (text_box.getText().toString().compareTo("Enter Text")==0)
                {
                    text_box.setText("");
                }
            }
        }
    });
15
Scoobler

Soyez prudent lorsque vous définissez du texte avec un écouteur onClick dans le champ sur lequel vous définissez le texte. Je faisais cela et je mettais le texte dans une chaîne vide. Cela faisait que le pointeur montait pour indiquer où se trouvait mon curseur, qui disparaîtra normalement après quelques secondes. Si je n'attendais pas que celle-ci disparaisse avant de quitter ma page, ce qui provoquerait l'appel de finish (), une fuite de mémoire serait alors causée et l'application serait bloquée. Il m'a fallu un certain temps pour comprendre ce qui causait l'accident sur celui-ci ..

Quoi qu'il en soit, je vous recommanderais d'utiliser selectAll () dans votre écouteur de clic sur plutôt que de setText () si vous le pouvez. Ainsi, une fois le texte sélectionné, l'utilisateur peut commencer à taper et tout le texte précédent sera effacé.

image du pointeur suspect: http://i.stack.imgur.com/juJnt.png

5
andymal

// Pour effacer lorsque le bouton Effacer est cliqué

firstName = (EditText) findViewById (R.id.firstName);

    clear = (Button) findViewById(R.id.clearsearchSubmit);

    clear.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (v.getId() == R.id.clearsearchSubmit);
            firstName.setText("");
        }
    });

Cela vous aidera à effacer les mauvais mots-clés que vous avez saisis. Vous pouvez donc cliquer sur le bouton pour effacer tout au lieu d'appuyer sur la touche Retour arrière encore et encore. Cela a fonctionné pour moi. J'espère que ça aide

3
ashim888

Code pour effacer le champ de texte lorsque vous cliquez dessus

<EditText Android:onClick="TextFieldClicked"/>

public void TextFieldClicked(View view){      
      if(view.getId()==R.id.editText1);
           text.setText("");    
}
1
kazi titu

Pour moi, le moyen le plus simple ... Créer un EditText public, par exemple "myEditText1"

public EditText myEditText1;

Ensuite, connectez-le avec le EditText qui devrait être effacé

myEditText1 = (EditText) findViewById(R.id.numberfield);

Après cela, créez un vide qui réagit à un clic sur l'EditText et laissez-le effacer le texte qu'il contient lorsqu'il est ciblé, par exemple

@OnClick(R.id.numberfield)
        void textGone(){
            if (myEditText1.isFocused()){
                myEditText1.setText("");

        }
    }

J'espère que je pourrai vous aider, passez une bonne journée tout le monde 

0
joki-9
((EditText) findViewById(R.id.User)).setText("");
((EditText) findViewById(R.id.Password)).setText("");
0
Dileep