最近TextInputLayout
を使用しましたが、これはsetError()
メソッドです。私が取得している問題は、setError(null)
を呼び出してエラーをクリアすると、下部に非常に多くの空きスペースが残ることです。
通常:
エラーあり:
エラーをクリアした後:
ソースを見ると、ビューがINVISIBLE
ではなくGONE
になっていることがわかりました。
.setListener(new ViewPropertyAnimatorListenerAdapter() { @Override public void onAnimationEnd(View view) { view.setVisibility(INVISIBLE); // here it is updateLabelVisibility(true); } }).start();
なぜそうなのだろうか?これを解決して空きスペースを避ける方法は?
のドキュメントをご覧ください
_public void setErrorEnabled (boolean enabled)
_
それは言います
このレイアウトでエラー機能が有効になっているかどうか。 setError(CharSequence)を介してエラーメッセージを設定する前にこの機能を有効にすると、エラーが表示されたときにこのレイアウトのサイズが変更されません。
これに基づいて、setErrorEnabled(true)
の前にsetError()
を設定し、setErrorEnabled(false)
の後にsetError(null)
を設定してみてください。
メソッドsetErrorEnabled(false)
は余分なスペースをクリアするので、setError(null)
の後に呼び出します。
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); } } } }
コードの繰り返しを避けるためのカスタムビューを作成し、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);
}
}
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);
TextInputLayoutのソースコードは以下を示しています。エラーをクリアする必要がある場合は、
_til.setErrorEnabled(false);
_
これにより、エラーテキストが非表示になり、下部のスペースが標準サイズに拡大されます。
エラーを再度設定する必要がある場合は、
_til.setError("Your text");
_
エラー機能が必要であると仮定して、自動的にtil.setErrorEnabled(true)
を呼び出します。
mTextInputLayout.setErrorEnabled(false);
を使用することにより、この問題を解決しました。
次のコードは正常に動作します
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) {
}
});