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.
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 ().
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) {
}
});
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.
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]);
}
}
cela s'appelle indice dans Android utiliser Android: hint = "Entrer le nom"
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("");
}
}
}
});
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
// 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
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("");
}
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
((EditText) findViewById(R.id.User)).setText("");
((EditText) findViewById(R.id.Password)).setText("");