我最近使用了TextInputLayout
及其setError()
方法。我遇到的问题是,当我通过调用setError(null)
清除错误时,它会在底部留下如此多的空白区域。
正常:
错误:
清除错误后:
在查看来源后,我发现他们正在制作视图INVISIBLE
而不是GONE
.setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationEnd(View view) { view.setVisibility(INVISIBLE); // here it is updateLabelVisibility(true); } }).start();
我想知道为什么会这样?如何解决这个问题以避免空白?
答案 0 :(得分:116)
查看
的文档public void setErrorEnabled (boolean enabled)
它说
此布局中是否启用了错误功能。 在通过设置错误消息之前启用此功能 setError(CharSequence),意味着这个布局不会改变 显示错误时的大小。
基于此,请尝试在setErrorEnabled(true)
之前设置setError()
,并在setErrorEnabled(false)
之后设置setError(null)
。
答案 1 :(得分:48)
方法setErrorEnabled(false)
将清除额外的空格,因此请在setError(null)
之后调用它。
答案 2 :(得分:4)
请参阅cassandra user mailing list页面。谷歌将在未来的支持库版本中发布该修复程序。它说,
如果您现在要修复它,可以扩展
setErrorEnabled()
和。{ 覆盖TextInputLayout
方法,但我无法保证 向后兼容性。因为改变状态有一些危险public class TextInputLayout extends android.support.design.widget.TextInputLayout{ public TextInputLayout(Context context) { super(context); } public TextInputLayout(Context context, AttributeSet attrs) { super(context, attrs); } public TextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void setErrorEnabled(boolean enabled) { super.setErrorEnabled(enabled); if (enabled) { return; } if (getChildCount() > 1) { View view = getChildAt(1); if (view != null) { view.setVisibility(View.GONE); } } } }
。loginArea
答案 3 :(得分:3)
不要使用setErrorEnabled(boolean)
,它不会从第二次出现错误。
public class MyTextInputLayout extends android.support.design.widget.TextInputLayout {
public MyTextInputLayout(Context context) {
super(context);
}
public MyTextInputLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyTextInputLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setError(@Nullable CharSequence error) {
super.setError(error);
View layout = getChildAt(1);
if (layout != null) {
if (error != null && !"".equals(error.toString().trim())) {
layout.setVisibility(VISIBLE);
} else {
layout.setVisibility(GONE);
}
}
}
}
然后只需setError(errorMessage);
或setError(null);
答案 4 :(得分:3)
我创建了一个自定义视图,以避免重复代码并覆盖setError
方法。
public class UserInputView extends TextInputLayout {
public UserInputView(Context context) {
this(context, null);
}
public UserInputView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public UserInputView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void setError(@Nullable CharSequence error) {
boolean isErrorEnabled = error != null;
setErrorEnabled(isErrorEnabled);
super.setError(error);
}
}
答案 5 :(得分:2)
TextInputLayout的源代码显示如下: 如果您需要清除错误,请使用
til.setErrorEnabled(false);
这将隐藏错误文本并将底部空间拉伸到其标准大小。
如果您需要再次设置错误,请使用
til.setError("Your text");
会自动调用til.setErrorEnabled(true)
,因为它假定您需要错误功能。
答案 6 :(得分:0)
以下代码可以正常使用
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) {
}
});
答案 7 :(得分:0)
通过使用mTextInputLayout.setErrorEnabled(false);
我解决了这个问题
答案 8 :(得分:0)
这是Kotlin解决问题的扩展:
fun TextInputLayout.clearError() {
error = null
isErrorEnabled = false
}
答案 9 :(得分:-1)
然后你应该像这样覆盖它:
@Override
public void onAnimationEnd(View view)
{
view.setVisibility(GONE); // <-- this is where you make it GONE
updateLabelVisibility(true);
}
或尝试这个,即按钮或任何你正在使用的东西:
final Button btn = (Button) findViewById(R.id.btn);
btn.setVisibility(View.GONE); //<--- makes the button gone