20

TextInputLayout输入一个文本后如何隐藏错误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>
4

11 回答 11

24

为了进一步说明 Prithviraj 给出的答案,TextInputLayout它本身并不进行验证。它只是一种显示错误或提示的机制。您负责设置/清除错误。这是您如何做到这一点的方法。请注意,除了 TextChangedListener 之外,您可能还需要 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));
        }
    }
}
于 2015-08-04T12:20:50.113 回答
11

你可以设置layoutEdtPhone.setErrorEnabled(false);

于 2015-08-04T11:48:22.640 回答
7

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
    }
}

这样,它会在设置新错误消息之前刷新错误消息。

于 2016-09-19T19:23:01.367 回答
5

我使用了 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/

于 2016-06-15T22:50:56.153 回答
3
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) {

        }
    });
于 2016-06-01T11:02:58.183 回答
2

使用 KTX:

textInputLayout.editText?.doOnTextChanged { text, start, count, after ->
    if (text?.any(invalidCharacters.toCharArray()::contains) == true) {
      textInputLayout.error = "Invalid character entered: ${invalidCharacters}"
    } else {
      textInputLayout.error = null
    }
  }
于 2021-01-19T09:10:12.170 回答
1

遗憾的是,没有内置机制来实现这种行为。我创建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);
于 2019-09-17T11:12:24.493 回答
0

如果要从 TextInputLayout 中删除错误显示,请使用:-

YourtextInputLayout.setErrorEnabled(false);

否则,如果您想从 edittextfield 中删除错误显示,请使用:-

edittext_id.setError(null);

我建议在 Android 中使用Textwatcher功能来进行更有效的验证处理。

例如:

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;
                }
            }
        });
于 2016-12-17T09:07:03.240 回答
0

这就是我使用扩展的自定义类完成它的方式TextInputLayout。与其他答案一样使用 a TextWatcher,但在 xml 中使用它后无需手动执行任何操作。它会为您处理一切。

public class CustomTextInputLayout extends TextInputLayout {
public CustomTextInputLayout(Context context) {
    super(context);
}

public CustomTextInputLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    initRemoveErrorWatcher();
}

private void initRemoveErrorWatcher() {
    EditText editText = getEditText();
    if (editText != null) {
        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) {
                setError(null);
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });
    }
}
}

要使用,只需TextInputLayout在您的 xml 中替换为:

<com.example.customViews.CustomTextInputLayout>...
于 2019-12-26T15:18:11.423 回答
-1

使用 textwatcher 这里的链接http://www.learn2crack.com/2014/02/android-textwatcher-example.html

于 2015-08-04T11:54:11.027 回答
-1

使用 if else 条件,如果条件为真 set TextInoutLayoutObj.setError(null); 如果它的错误在那里设置你的错误

于 2016-05-05T06:07:21.447 回答