programing

TextInputLayout.setError ()는 오류를 제거한 후 빈 공간을 남깁니다.

copyandpastes 2021. 1. 16. 11:01
반응형

TextInputLayout.setError ()는 오류를 제거한 후 빈 공간을 남깁니다.


나는 최근에 사용 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).


페이지를 참조 하십시오. 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(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);


반복되는 코드를 피하고 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)오류 기능이 필요하다고 가정하면 자동으로 호출 됩니다.


다음 코드는 잘 작동합니다.

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

        }
    });

mTextInputLayout.setErrorEnabled(false);나는 사용 함으로써이 문제를 해결했습니다.


그런 다음 다음과 같이 재정의해야합니다.

@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

참조 URL : https://stackoverflow.com/questions/34242902/textinputlayout-seterror-leaves-empty-space-after-clearing-the-error

반응형