안드로이드 : EditText 입력을 어떻게 확인할 수 있습니까?


169

일련의 EditText에서 양식 입력 유효성 검사를 수행해야합니다. 사용자가 각각 입력 한 후 유효성 검사를 트리거하기 위해 OnFocusChangeListeners를 사용하고 있지만 마지막 EditText에 대해 원하는대로 작동하지 않습니다.

최종 EditText에 입력하는 동안 "완료"단추를 클릭하면 InputMethod의 연결이 끊어 지지만 기술적으로 EditText에 대한 초점이 손실되지 않으므로 유효성 검사가 수행되지 않습니다.

가장 좋은 해결책은 무엇입니까?

InputMethod가 포커스가 변경 될 때가 아니라 각 EditText에서 바인딩 해제 될 때 모니터링해야합니까? 그렇다면 어떻게?


1
사용자가 입력하는 동시에 EditText 입력의 유효성을 검사해야합니까? 사용자가 완료 버튼을 클릭하면 EditText의 유효성을 검사하는 것이 어떻습니까?
Cristian

그것은 내가 원하는 것입니다 : 사용자가 완료 버튼을 클릭 할 때 텍스트를 확인하려면 (완료 버튼으로 QWERTY InputManager에서 "완료"버튼을 의미합니다 ... 양식의 제출 버튼이 아닙니다). 완료 버튼을 눌렀을 때 포커스는 양식의 마지막 요소에 유지되며 유효성 검사 방법이 트리거되지 않습니다. 내 말이 분명하길 바래 ..
Stefan

@Cristian의 솔루션은 내가 찾던 것과 정확히 여기에 있습니다 : stackoverflow.com/questions/43013812/…
LampPost

@Cristian 조금 늦게 왔지만 사람이 입력 하는 동안 EditText가 유효한 솔루션을 찾고 있습니다. 로그인 / 등록 양식이 있고 양식 데이터가 유효한 경우 에만 "제출"버튼을 표시하려고 합니다.
Zonker.in.Geneva

답변:


154

왜 사용하지 TextWatcher않습니까?

당신이 다수 가지고 있기 때문에 EditText상자 검증, 나는 다음 당신을 맞게된다 생각 :

  1. 당신의 활동은 android.text.TextWatcher인터페이스를 구현
  2. TextChanged 리스너를 EditText 상자에 추가합니다
txt1.addTextChangedListener(this);
txt2.addTextChangedListener(this);
txt3.addTextChangedListener(this);
  1. 재정의 된 메소드 중 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의 답변을 참조하십시오.


3
정확히 내가 필요한 것 같습니다. TextWatcher (SDK / API의 새로운 기능)에 대해 들어 보지 못했지만 테스트하여 예상대로 작동하는지 확인합니다. 정보 주셔서 감사합니다!
Stefan

1
천만에요! :) 이제 유효성 검사 중이므로 유효성 검사 실패를 사용자에게 알리는 방법을 공유 할 수 있습니까? 현재 동일한 방법을 찾고 있습니다.
Niks

Nikhil Patil, 나는 단지 토스트를 사용하여 사용자에게 그들이 잘못한 것을 알린다. 귀하의 경우에 이것이 효과가없는 몇 가지 이유가 있습니까?
예브게니 심킨

5
물론, 토스트는 안드로이드에서 자연스러운 방법입니다. 그러나 유효성 검사가 필요한 화면에 상당한 양의 요소가 있으면 토스트가 올바른 선택이 아닌 것 같습니다. (IMHO, 사용자를 성가 시게 할 것입니다) TextView.setError () ( developer.android.com / reference / android / widget /…
Niks

1
TextWatcher에 대한 지원이 좋지 않지만 작동합니다.
Tivie

125

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 */
    }
});

4
@fremmedehenvendelser : 모든 EditTextIS-ATextView
Niks

2
멋진 추상화와 추상 클래스 사용
Saher Ahwal

1
@fullmeriffic은 아마도 EditText를 초기화하지 않았을 것입니다. addTextChangedListener보기에서 편집 텍스트를 해결 한 후 전화하십시오
Ghostli


2
실제로 인터페이스 분리 원리
Maciej Beimcik

92

오류가 발생할 때 좋은 유효성 검사 팝업 및 이미지를 원한다면 여기에 설명 된대로 클래스 의 setError메소드를 사용할 수 있습니다EditText

링크 된 게시물의 작성자 인 Donn Felker에서 가져온 setError 사용 스크린 샷


TextWatcher가 두 개의 EditText 에 액세스하는 방법은 무엇입니까? 에 TextWatcher를 성공적으로 추가 passwordConfirmTextField했지만 다른를 참조해야 passwordTextField하므로 비교할 수 있습니다. 어떤 제안?
Zonker.in.Geneva

26

유효성 검사 논리의 세부 정보를 줄이기 위해 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클래스 를 확장하여 고유 한 규칙을 작성할 수 있습니다 .


이 라이브러리는 매력처럼 작동합니다. 그러나 @TextRule 주석은 버전 2.0.3에서 제거 되었습니까?
LTroya

1
@Length주석 으로 대체되었습니다 .
Ragunath Jawahar

@RagunathJawahar 나는 들어오는 데이터, 즉 연락처를 유효성 검사하면 유효성 검사가 작동하지 않는다는 것을 언급 했으므로 Intent-> Contacts에서 온 Email을 유효성 검사하려고하지만 EditText에 집중하고 텍스트를 추가 / 삭제 한 다음 유효성 검사 TextChange에서 유효성 검사가 호출되고 Contact에서 데이터를받을 때 validate ()도 호출됩니다.
Ronak Mehta

11

이것은 여기 에서 좋은 해결책이었습니다.

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

어떻게 공간과 함께 사용하고 서로 옆에 두 공간을 제한하지 않습니까?
chiru

10

업데이트 된 접근 방식-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 저장소에 대한 예제를 만들었습니다. 원한다면 예제를 확인하십시오!


가장 좋은 대답이지만 사용해야합니다 com.google.android.material.textfield.TextInputLayout( 재료 변경에 주목하십시오 ). 이 답변에서 얻었습니다 : stackoverflow.com/a/56753953/900394
Alaa M.

8

기본적으로 일부 유효성 검사 방법을 지원하고 실제로 매우 유연한 EditText를 확장하는 클래스를 작성했습니다.

내가 작성한 것처럼 현재 xml 속성 유효성 검사 방법을 통해 기본적으로 지원되는 내용 은 다음과 같습니다.

  1. 알파
  2. 알파벳 숫자
  3. 숫자
  4. 일반 정규식
  5. 문자열 비우기

여기서 확인할 수 있습니다

즐기 셨으면 좋겠습니다 :)


7

Android에서 텍스트 입력의 유효성을 검사하는 데 InputFilter가 더 적합하다는 것을 알았습니다.

간단한 예제는 다음과 같습니다. Android에서 EditText의 문자를 제한하기 위해 InputFilter를 어떻게 사용합니까?

제한 사항에 대해 사용자에게 피드백을주기 위해 토스트를 추가 할 수 있습니다. 또한 android : inputType 태그를 확인하십시오.


1
이것은 입력 할 때 유효성을 검사 할 수있는 좋은 솔루션 (알파 숫자 입력)이지만 사용자가 입력 (이메일 주소)을 입력 한 후에 만 ​​유효성을 검사 해야하는 경우에는 작동하지 않습니다.
Peter Ajtai

그 건배를 어떻게 촉발 하시겠습니까? 이 필터는 모든 텍스트 감시자가 반응하지 못하게합니다. 아마도 onKeyListener와 함께?
스팬

filter () 메서드 (InputFilter 클래스)에서 IF 조건으로 토스트를 트리거했습니다.
Moisés September

6

필자는 필드 내 유효성 검사를 수행하고 필드 간 유효성 검사를 수행하여 내 값이 부호없는 부동 소수점 값이고 다른 경우에는 부동 소수점 값인지 테스트해야했습니다. 나를 위해 작동하는 것 같습니다 :

    <EditText
        android:id="@+id/x" 
        android:background="@android:drawable/editbox_background" 
        android:gravity="right" 
        android:inputType="numberSigned|numberDecimal" 
    />

"numberSigned | numberDecimal"안에 공백이 없어야합니다. 예 : "numberSigned | numberDecimal"이 작동하지 않습니다. 왜 그런지 잘 모르겠습니다.


5

이것은 유망한 것으로 보이며 의사가 나를 위해 주문한 것입니다.

EditText Validator

    public void onClickNext(View v) {
    FormEditText[] allFields    = { etFirstname, etLastname, etAddress, etZipcode, etCity };
    
    
    boolean allValid = true;
    for (FormEditText field: allFields) {
        allValid = field.testValidity() && allValid;
    }
    
    if (allValid) {
        // YAY
    } else {
        // EditText are going to appear with an exclamation mark and an explicative message.
    }
}

사용자 지정 유효성 검사기 및 내장 유효성 검사기 :

  • regexp : 사용자 정의 regexp
  • numeric : 유일한 숫자 필드
  • alpha : 알파 전용 필드
  • alphaNumeric : 무엇을 추측합니까?
  • personName : 입력 한 텍스트가 사람 이름인지 성인 지 확인합니다.
  • personFullName : 입력 한 값이 완전한 이름인지 확인합니다.
  • email : 필드가 유효한 이메일인지 확인
  • creditCard : Luhn 알고리즘을 사용하여 필드에 유효한 신용 카드가 포함되어 있는지 확인
  • phone : 필드에 유효한 전화 번호가 포함되어 있는지 확인
  • domainName : 필드에 유효한 도메인 이름이 포함되어 있는지 확인합니다 (항상 API 레벨 <8의 테스트를 통과 함)
  • ipAddress : 필드에 유효한 IP 주소가 있는지 확인
  • webUrl : 필드에 유효한 URL이 포함되어 있는지 확인합니다 (항상 API 레벨 <8의 테스트를 통과 함)
  • date : 필드가 유효한 날짜 / 날짜 / 시간 형식인지 확인합니다 (customFormat이 설정된 경우 customFormat으로 확인)
  • nocheck : 필드의 공란을 제외하고는 아무것도 확인하지 않습니다.

2

main.xml 파일에서

편집 텍스트에서 영문자 만 허용 할 수있는 유효성을 검증하기 위해 다음과 같은 속성을 사용할 수 있습니다.

이 작업을 수행 :

  android:entries="abcdefghijklmnopqrstuvwxyz"

2

사용자가 키보드에서 "완료"버튼을 눌렀을 때 원하는 동작을 얻을 수 있으며 내 게시물 "Android form validation-올바른 방법" 에서 EditText 작업에 대한 다른 팁을 확인하십시오.

샘플 코드 :

mTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_DONE) {                    
            validateAndSubmit();
            return true;
        }
        return false;
    }});  

0

이메일 및 비밀번호 확인을 위해

  if (isValidEmail(et_regemail.getText().toString())&&etpass1.getText().toString().length()>7){
      if (validatePassword(etpass1.getText().toString())) {
      Toast.makeText(getApplicationContext(),"Go Ahead".....
      }
      else{

       Toast.makeText(getApplicationContext(),"InvalidPassword".....
       }

}else{

 Toast.makeText(getApplicationContext(),"Invalid Email".....
}


public boolean validatePassword(final String password){
    Pattern pattern;
    Matcher matcher;
    final String PASSWORD_PATTERN = "^(?=.*[0-9])(?=.*[A-Z])(?=.* 
    [@#$%^&+=!])(?=\\S+$).{4,}$";
    pattern = Pattern.compile(PASSWORD_PATTERN);
    matcher = pattern.matcher(password);

    return matcher.matches();
}

public final static boolean isValidEmail(CharSequence target) {
    if (target == null)
        return false;

    return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}

-2

다음과 같이 머티리얼 디자인 EditText inside 및 EditTextLayout을 쉽게 확인할 수있는 Android 용이 라이브러리를 만들었습니다.

    compile 'com.github.TeleClinic:SmartEditText:0.1.0'

다음과 같이 사용할 수 있습니다.

<com.teleclinic.kabdo.smartmaterialedittext.CustomViews.SmartEditText
    android:id="@+id/passwordSmartEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:setLabel="Password"
    app:setMandatoryErrorMsg="Mandatory field"
    app:setPasswordField="true"
    app:setRegexErrorMsg="Weak password"
    app:setRegexType="MEDIUM_PASSWORD_VALIDATION" />

<com.teleclinic.kabdo.smartmaterialedittext.CustomViews.SmartEditText
    android:id="@+id/ageSmartEditText"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:setLabel="Age"
    app:setMandatoryErrorMsg="Mandatory field"
    app:setRegexErrorMsg="Is that really your age :D?"
    app:setRegexString=".*\\d.*" />

그런 다음 다음과 같이 유효한지 확인할 수 있습니다.

    ageSmartEditText.check()

더 많은 예제와 사용자 정의를 위해 저장소 https://github.com/TeleClinic/SmartEditText를 확인 하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.