일련의 EditText에서 양식 입력 유효성 검사를 수행해야합니다. 사용자가 각각 입력 한 후 유효성 검사를 트리거하기 위해 OnFocusChangeListeners를 사용하고 있지만 마지막 EditText에 대해 원하는대로 작동하지 않습니다.
최종 EditText에 입력하는 동안 “완료”단추를 클릭하면 InputMethod의 연결이 끊어 지지만 기술적으로 EditText에 대한 초점이 손실되지 않으므로 유효성 검사가 수행되지 않습니다.
가장 좋은 해결책은 무엇입니까?
InputMethod가 포커스가 변경 될 때가 아니라 각 EditText에서 바인딩 해제 될 때 모니터링해야합니까? 그렇다면 어떻게?
답변
왜 사용하지 TextWatcher
않습니까?
당신이 다수 가지고 있기 때문에 EditText
상자 검증, 나는 다음 당신을 맞게된다 생각 :
- 당신의 활동은
android.text.TextWatcher
인터페이스를 구현 - TextChanged 리스너를 EditText 상자에 추가합니다
txt1.addTextChangedListener(this);
txt2.addTextChangedListener(this);
txt3.addTextChangedListener(this);
- 재정의 된 메소드 중
afterTextChanged(Editable s)
다음과 같이 메소드를 사용할 수 있습니다.
@Override
public void afterTextChanged(Editable s) {
// validation code goes here
}
Editable s
변경되는 EditText 상자의 텍스트를 찾는 데 실제로 도움 이 되지는 않습니다. 그러나 EditText 상자의 내용을 직접 확인할 수 있습니다.
String txt1String = txt1.getText().toString();
// Validate txt1String
같은 방법으로. 나는 분명하고 희망이 있으면 도움이됩니다! 🙂
편집 : 깔끔한 접근 방식은 아래 Christopher Perry의 답변을 참조하십시오.
답변
TextWatcher는 내 취향에 따라 조금 장황하므로 뭔가를 삼키기가 더 쉬워졌습니다.
public abstract class TextValidator implements TextWatcher {
private final TextView textView;
public TextValidator(TextView textView) {
this.textView = textView;
}
public abstract void validate(TextView textView, String text);
@Override
final public void afterTextChanged(Editable s) {
String text = textView.getText().toString();
validate(textView, text);
}
@Override
final public void beforeTextChanged(CharSequence s, int start, int count, int after) { /* Don't care */ }
@Override
final public void onTextChanged(CharSequence s, int start, int before, int count) { /* Don't care */ }
}
다음과 같이 사용하십시오.
editText.addTextChangedListener(new TextValidator(editText) {
@Override public void validate(TextView textView, String text) {
/* Validation code here */
}
});
답변
답변
유효성 검사 논리의 세부 정보를 줄이기 위해 Android 용 라이브러리를 작성했습니다 . 주석 및 기본 제공 규칙을 사용하여 대부분의 일상적인 유효성 검사를 처리합니다. 같은 제약이있다 @TextRule
, @NumberRule
, @Required
, @Regex
, @Email
, @IpAddress
, @Password
, 등,
이러한 주석을 UI 위젯 참조에 추가하고 유효성 검증을 수행 할 수 있습니다. 또한 원격 서버에서 고유 한 사용자 이름을 확인하는 등의 상황에 이상적인 유효성 검사를 비동기 적으로 수행 할 수 있습니다.
주석을 사용하는 방법 에 대한 예제가 프로젝트 홈 페이지 에 있습니다. 유효성 검사를위한 사용자 지정 규칙을 작성하는 방법에 대한 샘플 코드를 작성한 관련 블로그 게시물을 읽을 수도 있습니다 .
다음은 라이브러리 사용법을 나타내는 간단한 예입니다.
@Required(order = 1)
@Email(order = 2)
private EditText emailEditText;
@Password(order = 3)
@TextRule(order = 4, minLength = 6, message = "Enter at least 6 characters.")
private EditText passwordEditText;
@ConfirmPassword(order = 5)
private EditText confirmPasswordEditText;
@Checked(order = 6, message = "You must agree to the terms.")
private CheckBox iAgreeCheckBox;
라이브러리는 확장 가능하며 Rule
클래스 를 확장하여 고유 한 규칙을 작성할 수 있습니다 .
답변
이것은 여기 에서 좋은 해결책이었습니다.
InputFilter filter= new InputFilter() {
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
String checkMe = String.valueOf(source.charAt(i));
Pattern pattern = Pattern.compile("[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789_]*");
Matcher matcher = pattern.matcher(checkMe);
boolean valid = matcher.matches();
if(!valid){
Log.d("", "invalid");
return "";
}
}
return null;
}
};
edit.setFilters(new InputFilter[]{filter});
답변
업데이트 된 접근 방식-TextInputLayout :
구글은 최근 디자인 지원 라이브러리를 출시하고라는 하나 개의 구성 요소가 TextInputLayout 그것을 통해 오류를 보여주는를 지원 setErrorEnabled(boolean)
하고 setError(CharSequence)
.
사용 방법?
1 단계 : TextInputLayout으로 EditText 래핑 :
<android.support.design.widget.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/layoutUserName">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="hint"
android:id="@+id/editText1" />
</android.support.design.widget.TextInputLayout>
2 단계 : 입력 확인
// validating input on a button click
public void btnValidateInputClick(View view) {
final TextInputLayout layoutUserName = (TextInputLayout) findViewById(R.id.layoutUserName);
String strUsername = layoutLastName.getEditText().getText().toString();
if(!TextUtils.isEmpty(strLastName)) {
Snackbar.make(view, strUsername, Snackbar.LENGTH_SHORT).show();
layoutUserName.setErrorEnabled(false);
} else {
layoutUserName.setError("Input required");
layoutUserName.setErrorEnabled(true);
}
}
내 Github 저장소에 대한 예제를 만들었습니다. 원한다면 예제를 확인하십시오!
답변
기본적으로 일부 유효성 검사 방법을 지원하고 실제로 매우 유연한 EditText를 확장하는 클래스를 작성했습니다.
내가 작성한 것처럼 현재 xml 속성 유효성 검사 방법을 통해 기본적으로 지원되는 내용 은 다음과 같습니다.
- 알파
- 알파벳 숫자
- 숫자
- 일반 정규식
- 문자열 비우기
여기서 확인할 수 있습니다
즐기 셨으면 좋겠습니다 🙂