Dans mon application sous Android, il existe de nombreux champs EditText. Et j’ai rencontré un problème avec indice . Il ne disparaît pas lorsque EditText est activé, mais il disparaît lorsque je commence à écrire quelque chose . Comment résoudre ce problème? Parce que j'ai besoin que l'indication disparaisse lorsque le champ EditText est touché.
C'est par exemple:
<EditText
Android:layout_width="260dp"
Android:layout_height="30dp"
Android:ems="10"
Android:inputType="text"
Android:id="@+id/driv_lic_num_reg"
Android:hint="@string/driver_license_numb"
Android:textColor="@color/black"
Android:textColorHint="@color/grey_hint"
Android:background="@drawable/input_field_background"
Android:layout_alignParentTop="true"
Android:layout_centerHorizontal="true"
Android:layout_margin="2dp"
Android:textCursorDrawable="@color/black"
Android:textSize="15dp"
Android:paddingLeft="10dp"
Android:nextFocusDown="@+id/pass_reg"
Android:imeOptions="actionNext"
Android:maxLines="1"
Android:maxLength="50"
Android:focusableInTouchMode="true"/>
Le conseil ne disparaît que lorsque vous tapez du texte, pas le focus. Je ne pense pas qu'il existe un moyen automatique de le faire, peut-être que je me trompe. Cependant, comme solution de contournement, j'utilise le code suivant pour supprimer un indice sur le focus dans EditText
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus)
myEditText.setHint("");
else
myEditText.setHint("Your hint");
}
});
Vous pouvez également personnaliser votre code XML à l'aide de Selector. Voici un exemple de code.
Créez un sélecteur. Dans le fichier selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_focused="true" Android:color="@Android:color/transparent" />
<item Android:color="@color/gray" />
</selector>
À votre avis
Android:textColorHint="@drawable/selector"
Voici ma solution, où l'indice disparaît lorsque l'utilisateur focus editText et réapparaît lorsque l'attention se modifie à un autre endroit si l'edittext est toujours vide:
editText.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
editText.setHint("");
return false;
}
});
editText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
editText.setHint("Hint");
}
}
});
espérons que cela aide quelqu'un
Ceci est ma solution:
final EditText editText = (EditText) findViewById(R.id.activity_edittext);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
editText .setHint("my little hint");
} else {
editText .setHint("");
}
}
});
La solution de sélecteur proposée par windyzboy ne fonctionne pas pour les EditTexts avec un texte centré, car le curseur reste derrière le texte transparent au lieu de se déplacer au centre.
Un bon moyen de ne pas polluer votre code est de créer un EditText personnalisé, car vous avez probablement besoin du même style dans toute l'application. De cette façon, vous pouvez éviter d'ajouter des contrôles pour chaque EditText séparément.
public class HideHintEditText extends EditText {
CharSequence hint;
public HideHintEditText(Context context) {
super(context);
hint = this.getHint();
}
public HideHintEditText(Context context, AttributeSet attrs) {
super(context, attrs);
hint = this.getHint();
}
public HideHintEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
hint = this.getHint();
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
this.setHint(focused ? "" : hint);
}
}
Ma solution est comme ça. Il montre un indice lorsqu'il est vide et non focalisé et cache s'il y a du texte ou s'il est touché
fun hideHint() {
tilFloating.isHintAnimationEnabled = false
etFloating.onFocusChangeListener = OnFocusChangeListener { v, hasFocus ->
if ((etFloating.text != null && etFloating.text.toString() != "") || hasFocus)
tilFloating.hint = ""
else
tilFloating.hint = mHint
}
}
Android:hint="User Name"
Cette ligne de code peut être faite aussi facilement!
<EditText
Android:id="@+id/edtUserName"
Android:layout_width="match_parent"
Android:layout_height="50dp"
Android:layout_weight="1"
Android:ems="10"
Android:inputType="textPersonName"
Android:hint="User Name" />
Ici, j'ai utilisé le peu de code pour cacher et montrer un indice Peut-être que ça va être utile.
txt_username.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(txt_username.getText().toString().isEmpty()){
if(hasFocus){
txt_username.setHint("");
}else{
txt_username.setHint(R.string.username);
}
}
}
});
findViewById(R.id.mainLayout).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hideKeyboard();
editText.clearFocus();
if (TextUtils.isEmpty(editText.getText().toString())) {
editText.setHint("your hint");
}
}
});
editText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
editText.setHint("");
return false;
}
});
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus)
editText.setHint("");
else
editText.setHint("your hint");
}
});