web-dev-qa-db-ja.com

TextInputLayout.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();

なぜそうなのだろうか?これを解決して空きスペースを避ける方法は?

53
Mangesh

のドキュメントをご覧ください

_public void setErrorEnabled (boolean enabled)
_

それは言います

このレイアウトでエラー機能が有効になっているかどうか。 setError(CharSequence)を介してエラーメッセージを設定する前にこの機能を有効にすると、エラーが表示されたときにこのレイアウトのサイズが変更されません。

これに基づいて、setErrorEnabled(true)の前にsetError()を設定し、setErrorEnabled(false)の後にsetError(null)を設定してみてください。

121
harshitpthk

メソッドsetErrorEnabled(false)は余分なスペースをクリアするので、setError(null)の後に呼び出します。

48
Mike Margulies

this ページを参照してください。 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);
            }
        }
    }
}
4
Shaode Lu

コードの繰り返しを避けるためのカスタムビューを作成し、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);
        }

     }
3
Rahul

setErrorEnabled(boolean)を使用しないでください。2回目以降のエラーは表示されません。

_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);

3
Neela

TextInputLayoutのソースコードは以下を示しています。エラーをクリアする必要がある場合は、

_til.setErrorEnabled(false);
_

これにより、エラーテキストが非表示になり、下部のスペースが標準サイズに拡大されます。

エラーを再度設定する必要がある場合は、

_til.setError("Your text");
_

エラー機能が必要であると仮定して、自動的にtil.setErrorEnabled(true)を呼び出します。

2
romariomkk

mTextInputLayout.setErrorEnabled(false);を使用することにより、この問題を解決しました。

0
Rohit Sharma

次のコードは正常に動作します

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

        }
    });
0
Gowsik K C