TextInputLayout
に1つのテキストを入力した後、EditText
エラーを非表示にするにはどうすればよいですか。出来ますか?
どうすればこれを達成できますか、ここで何か間違っています。!!
コード
layoutEdtPhone =(TextInputLayout)rootView.findViewById(R.id.layoutEdtPhone);
layoutEdtPhone.setErrorEnabled(true);
layoutEdtPhone.setError(getString(R.string.ui_no_phone_toast));
layoutEdtPassword = (TextInputLayout)rootView.findViewById(R.id.layoutEdtPassword);
layoutEdtPassword.setErrorEnabled(true);
layoutEdtPassword.setError(getString(R.string.ui_no_password_toast));
edtPhone=(EditText)rootView.findViewById(R.id.edtPhone);
edtPassword=(EditText)rootView.findViewById(R.id.edtPassword);
xml
<EditText
Android:id="@+id/edtPhone"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="100dp"
Android:background="@drawable/edt_background_selector"
Android:drawableLeft="@drawable/phone_icon"
Android:drawableStart="@drawable/phone_icon"
Android:hint="@string/phone"
Android:inputType="phone"
Android:padding="5dip"
Android:singleLine="true"
Android:textSize="14sp" />
</Android.support.design.widget.TextInputLayout>
<Android.support.design.widget.TextInputLayout
Android:id="@+id/layoutEdtPassword"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content" >
<EditText
Android:id="@+id/edtPassword"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="16dp"
Android:background="@drawable/edt_background_selector"
Android:drawableLeft="@drawable/password_icon"
Android:drawableStart="@drawable/password_icon"
Android:hint="@string/password"
Android:inputType="textPassword"
Android:padding="5dip"
Android:singleLine="true"
Android:textSize="14sp" />
</Android.support.design.widget.TextInputLayout>
Prithvirajの回答をさらに詳しく説明すると、TextInputLayout
は検証自体を行いません。これは、エラーまたはヒントを表示するための単なるメカニズムです。エラーを設定/クリアするのはあなたの責任です。以下にその方法を示します。 TextChangedListenerに加えて、ユーザーが最初のフィールドを変更せずに2番目の編集テキストにジャンプしたときにエラーを設定するために、OnFocusChangeListenerも必要になる場合があることに注意してください。
protected void onCreate(Bundle savedInstanceState) {
//.....
edtPhone.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
validateEditText(s);
}
});
edtPhone.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
validateEditText(((EditText) v).getText());
}
}
});
}
private void validateEditText(Editable s) {
if (!TextUtils.isEmpty(s)) {
layoutEdtPhone.setError(null);
}
else{
layoutEdtPhone.setError(getString(R.string.ui_no_password_toast));
}
}
}
layoutEdtPhone.setErrorEnabled(false);
を設定できます
行う
mTextInputLayout.setError(null);
エラーメッセージをクリアします。
次のようなエラーをチェックする方法をお勧めします。
@Override
public void checkErrorBeforeAction() {
boolean error = false;
mTextInputLayout.setError(null);
if (mEditText.getText().toString().length == 0)) {
mTextInputLayout.setError("Field empty");
}
else if (mEditText.getText().toString().isValid) { // Other condition
mTextInputLayout.setError("Field is invalid");
}
if (!error) {
// Call action
}
}
これにより、新しいエラーメッセージを設定する前にエラーメッセージが更新されます。
ButterKnife の@TextChangedを使用し、私のために働いた、見てください:
@Bind(R.id.layoutEdtPhone)
TextInputLayout tlayoutEdtPhone;
@Bind(R.id.edtPhone)
EditText edtPhone;
//start ButterKnife (I spent the URL with full description for initilize)
@OnTextChanged(R.id.edtPhone)
public void changedTextOnEditPhone() {
tlayoutEdtPhone.setError("");
}
ButterKnifeについて知りたい場合は、より詳細な記事を書きましたが、それは母国語、つまりpt_brで行われました。 http://blog.alura.com.br/aumentando-a-produtividade-com-butter-knife-no-Android/
textInputLatout.getEditText().addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s.length() < 1) {
textInputLayout.setErrorEnabled(true);
textInputLayout.setError("Please enter a value");
}
if (s.length() > 0) {
textInputLayout.setError(null);
textInputLayout.setErrorEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
残念ながら、この動作を実現する組み込みメカニズムはありません。私が助けてくれるViewUtils
クラスを作成しました:
public final class ViewUtils {
private ViewUtils() {}
public static void resetTextInputErrorsOnTextChanged(TextInputLayout... textInputLayouts) {
for (final TextInputLayout inputLayout : textInputLayouts) {
EditText editText = inputLayout.getEditText();
if(editText != null) {
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
}
@Override
public void onTextChanged(final CharSequence s, final int start, final int before, final int count) {
}
@Override
public void afterTextChanged(final Editable s) {
if(inputLayout.getError() != null) inputLayout.setError(null);
}
});
}
}
}
}
そして、クライアントコードで簡単に使用できます。
ViewUtils.resetTextInputErrorsOnTextChanged(mEmailTextInputLayout, mPasswordTextInputLayout);
TextInputLayoutからエラー表示を削除する場合:
YourtextInputLayout.setErrorEnabled(false);
それ以外の場合は、edittextfieldからエラー表示を削除する場合:
edittext_id.setError(null);
より効率的な検証処理のために、AndroidでTextwatcher fucntionを使用することをお勧めします。
例えば:
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
if (!validatefName()) {
return;
}
}
});