清除错误

时间:2015-12-12 17:34:37

标签: android android-textinputlayout

我最近使用了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();

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

10 个答案:

答案 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