8

我有一些垂直线性布局和一些输入字段。使用TextInputLayout我使用标签和内置错误消息获得了很好的流。我的问题是当我添加和删除错误消息。当删除错误消息时,TextInputLayout的错误视图不会被删除

如果我添加一条错误消息,它位于编辑文本下面,一切都很好。

如果我用setError(null)删除错误消息,则消息被删除,但空间仍然存在。这显然是每个Google的设计(见https://code.google.com/p/android/issues/detail?id=176005)。我非常喜欢这个空间,因为它使UI看起来非常错误。

如果我.setErrorEnabled(false)视图被删除,一切看起来很正常。但是,如果用户更改了数据,并且执行了另一个setError错误消息,则不会显示(只有编辑文本行是红色的)。

+0

您是否调用TextInputLayout或EditText的setError()方法? – Moinkhan

+0

textinputlayout上的所有内容。 – Gober

+0

尝试在EditText上调用EditText的setError ... – Moinkhan

回答

20

从支持库版本23.1.1(也许更早)开始,应该不再是这种情况。如果错误不为空或空,您应该可以调用TextInputLayout.setErrorEnabled(false)来隐藏错误TextView,现在呼叫TextInputLayout.setError(error)在内部调用TextInputLayout.setErrorEnabled(true)。请参阅下面的代码片段,取自支持库:

public void setError(@Nullable CharSequence error) { 
    if (!mErrorEnabled) { 
     if (TextUtils.isEmpty(error)) { 
      // If error isn't enabled, and the error is empty, just return 
      return; 
     } 
     // Else, we'll assume that they want to enable the error functionality 
     setErrorEnabled(true); 
    } 
    ... 
} 
+1

谢谢。这现在效果更好。之前,我查找了TextInputLayout的子元素,并将可见性设置为消失。现在你可以简单地对新错误执行input.setError(..)并将input.setErrorEnabled(false)移除。来回工作。只是做input.setError(null)还是不错的,但你不能全部拥有。 – Gober

+1

在我的情况下,我不得不同时做两个input.setError(null)&input.setErrorEnabled(false)才能正常工作。 – User31689

+1

不幸的是它不适用于版本23.2.1。如果您查看方法的最开始部分,如果提供的错误字符串先前已设置,则返回: if(TextUtils.equals(mError,error)){ //如果我们已经有相同的错误,则忽略 return; } – Singed