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.
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.
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().
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) {
}
});
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/
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.
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.
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]);
}
}
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.
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