Как сделать подсказку исчезнуть при касании edittext?
В моем приложении в android есть много полей EditText. И я столкнулся с проблемой с намеком.
Он не исчезает, когда EditText работает на tuch, но исчезает, когда я начинаю писать somathing.
Как можно устранить эту проблему? Потому что мне нужно, чтобы подсказка исчезла при касании поля EditText.
Это, например:
<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"/>
Ответы
Ответ 1
Подсказка исчезает только при вводе текста, а не в фокусе. Я не думаю, что есть какой-либо автоматический способ сделать это, возможно, я ошибаюсь. Однако в качестве обходного пути я использую следующий код для удаления намека на фокус в EditText
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus)
myEditText.setHint("");
else
myEditText.setHint("Your hint");
}
});
Ответ 2
Вы также можете настроить свой XML-код с помощью Selector. Вот пример кода.
Создайте селектор. В файле 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>
На ваш взгляд
android:textColorHint="@drawable/selector"
Ответ 3
Здесь мое решение, где подсказка исчезает, когда пользователь нажимает editText и появляется снова, когда фокус меняется на другое место, если edittext по-прежнему пуст:
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");
}
}
});
надеюсь, что это поможет кому-то
Ответ 4
Это мое решение:
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("");
}
}
});
Ответ 5
Предлагаемое селекторное решение от windyzboy не работает для EditTexts с центрированным текстом, потому что курсор остается за прозрачным текстом подсказки, а не перемещается в центр.
Хорошим способом без загрязнения вашего кода является создание специального EditText, поскольку вам, вероятно, нужен один и тот же стиль для всего приложения. Таким образом, вы можете избежать добавления проверок для каждого EditText отдельно.
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);
}
}
Ответ 6
Попробуйте
EditText editText = (EditText) findViewById(...);
editText.setHint("");
в вашей логике onTouch
.
Однако ваш намек должен исчезать, когда вы нажимаете на редактирование текста.
Итак, перепроверьте логику вашего приложения.
Ответ 7
Здесь я использовал немного кода, чтобы скрыть и показать подсказку
может быть, это будет полезно.
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);
}
}
}
});
Ответ 8
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");
}
});
Ответ 9
android:hint="User Name"
Эта строка кода может быть легко выполнена!
<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" />
Ответ 10
Каждое решение может работать или нет, я не знаю, но следующие шаги определенно помогут.
Сначала создайте фиктивный фокус, чтобы скрыть редактирование текста от фокусировки на
<LinearLayout
android:focusable="true"
android:focusableInTouchMode="true"
android:layout_width="0px"
android:layout_height="0px"/>
Затем обычно устанавливайте подсказку в вашем примере EditText:
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:inputType="text"
android:ems="10"
android:id="@+id/editText"
android:hint="Your Hint"
android:focusableInTouchMode="true"
/>
Наконец, добавьте следующий код в свою деятельность или фрагмент, где вы намереваетесь
editText.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
editText.setHint("");
return false;
}
});