SetError()在清除错误后留出空白

我最近使用了 TextInputLayout和它的 setError()方法。我得到的问题是,当我通过调用 setError(null)来清除错误时,它在底部留下了太多的空白。

正常:

Normal

错误的是:

With error

清除错误后:

After clearing error

在查看源代码后,我发现他们正在制作视图 INVISIBLE而不是 GONE

.setListener(new ViewPropertyAnimatorListenerAdapter() {
@Override
public void onAnimationEnd(View view) {
view.setVisibility(INVISIBLE); // here it is


updateLabelVisibility(true);
} }).start();

我想知道为什么会这样? 如何解决这个问题,以避免空白的空间?

32792 次浏览

那么你应该这样覆盖它:

@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

看看这些文件

public void setErrorEnabled (boolean enabled)

上面说

在此布局中是否启用了错误功能。 在通过以下方法设置错误消息之前启用此功能 SetError (CharSequence)将意味着此布局不会更改 显示错误时的大小。

在此基础上,尝试在 setError()之前设置 setErrorEnabled(true),在 setError(null)之后设置 setErrorEnabled(false)

请参阅 这个页面。 Google 将在未来的支持库版本中发布该修复程序。它说,

如果你想现在修复它,你可以扩展 TextInputLayout和 覆盖 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);
}
}
}
}

方法 setErrorEnabled(false)将清除额外的空间,因此在 setError(null)之后调用它。

下面的代码可以正常工作

    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) {


}
});

不要使用 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);

通过使用 mTextInputLayout.setErrorEnabled(false);我已经解决了这个问题

我创建了一个自定义视图来避免重复代码并覆盖 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);
}


}

TextInputLayout 的源代码如下: 如果需要清除错误,只需使用

til.setErrorEnabled(false);

这将隐藏错误文本并将底部空间拉伸到其标准大小。

如果需要再次设置错误,只需使用

til.setError("Your text");

它会自动调用 til.setErrorEnabled(true),因为它假定您需要错误功能。

这是 Kotlin 问题解法的延伸:

fun TextInputLayout.clearError() {
error = null
isErrorEnabled = false
}