私のアプリケーションではAndroidには多くのEditTextフィールドがあります。ヒントに問題が発生しました。EditTextにフォーカスがあると消えませんが、何かを書き始めると消えます。問題は修正されますか?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"/>
ヒントは、フォーカスではなくテキストを入力したときにのみ消えます。私はそれを行うための自動的な方法があるとは思わない、私が間違っているかもしれない。ただし、回避策として、次のコードを使用してEditTextのフォーカスに関するヒントを削除します
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus)
myEditText.setHint("");
else
myEditText.setHint("Your hint");
}
});
Selectorを使用してXMLコードをカスタマイズすることもできます。コードの例を次に示します。
セレクターを作成します。ファイル内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"
ここに私のソリューションがあります。ユーザーが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");
}
}
});
これが誰かを助けることを願って
これは私の解決策です:
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("");
}
}
});
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);
}
}
試して
EditText editText = (EditText) findViewById(...);
editText.setHint("");
onTouch
ロジックで。
ただし、編集テキストをクリックしたときは、ヒントが消えている必要があります。 再チェックアプリのロジック。
私の解決策はこのようなものです。空でフォーカスされていないときにヒントを表示し、テキストがある場合やタッチされている場合は非表示にします
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"
このコード行は簡単に実行できます!
<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" />
ここでは、少しのコードを使用して、役に立つかどうかのヒントを非表示および表示しています。
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");
}
});