11

我在创建登录表单时发现了一个问题。当用户正确填写内容时,我在 TextInputLayout 上显示一些错误并禁用它们。

错误示例

我用

mTextInputLayout.setError("This field is required");

并禁用它

mTextInputLayout.setError(null);

问题是仍然有空的 TextView 对象的填充,它显示了错误消息。所以我尝试通过设置完全禁用错误

mTextInputLayout.setErrorEnabled(false);

它可以工作并且看起来很好,但是我无法再次设置它。打电话时

mTextInputLayout.setErrorEnabled(true);
mTextInputLayout.setError("This field is required");

再次,我只看到一条读取行,而不是错误消息,因此显示错误消息的 TextView 似乎已被破坏并且没有再次创建。

我在这里读到,TextView 对象在setErrorEnabled(false)被调用时被破坏,并且似乎没有再次创建它。错误或功能?

该控件的源代码在 AOSP 中尚不可用,因此我使用 Android Studio 内置的反编译器检查代码以了解问题所在。我发现 setErrorEnabled() 实际上创建并销毁了一个 TextView 对象,而我期望它只是简单地切换可见性。

4

3 回答 3

10

如果有人遇到同样的问题,我找到了一个很好的解决方法。只需设置打开和关闭错误TextView对象的可见性,不要破坏该对象。

使用它来启用错误消息:

if (textInputLayout.getChildCount() == 2)
    textInputLayout.getChildAt(1).setVisibility(View.VISIBLE);

textInputLayout.setError("This field is required");

这用于禁用错误消息:

textInputLayout.setError(null);

if (textInputLayout.getChildCount() == 2)
    textInputLayout.getChildAt(1).setVisibility(View.GONE);
于 2015-10-20T08:36:30.227 回答
0

在我的情况下设置错误,清除错误和设置错误再次导致错误。一条线没有再次变红(API 23.4.0)。此解决方案有帮助:TextInputLayout.setError() 清除错误后留下空白空间

setErrorEnabled(false)之后调用setError(null)

于 2016-12-11T09:55:57.243 回答
0

从支持库版本 23.1.1(可能更早)开始,调用 setErrorEnabled(false) 将删除错误 TextView 并导致 TextInputLayout 在随后调用 setError(String) 时显示新错误。

但是,仍然存在一个错误,即清除错误消息后,不会从布局中删除额外的填充。可以使用上面@dabo 的帖子解决此错误:

https://code.google.com/p/android/issues/detail?id=200137

于 2016-02-02T21:51:31.173 回答