2016-06-01 5 views
0

EditText 사전 정의 된 단어 하나를 제외하고 어떻게 제한 할 수 있습니까?EditText를 특정 단어로만 작성하십시오.

입력이 정확히 "Hello"(대소 문자 무시) 여야한다고 가정 해 보겠습니다. 따라서 문자는 "안녕하세요"의 문자를 제외하고는 무시됩니다.

TextWatcher을 사용하고 수동으로 문자를 확인하고 싶지는 않습니다. 내가 어떻게 InputFilterRegex을 사용하여 할 수 있을지 궁금하네요?

내가 시도하는 것 :

InputFilter onboardingFilter = 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("hello", Pattern.CASE_INSENSITIVE); 
      Matcher matcher = pattern.matcher(checkMe); 
      boolean valid = matcher.matches(); 
      if(!valid){ 
       return ""; 
      } 
     } 
     return null; 
    } 
}; 

이 입력 아무것도 나를하지 않습니다. 나는 문제가 정규식 안에 있다는 것을 믿는다.

답변

1

먼저, 각 개별 문자 (이 경우 h, e, l, l, o, 개별적으로)에 대해 'hello'에 대한 정규식을 실행하고 있습니다. 그러나 'h'문자는 'hello'정규식을 찾을 수 없으므로 결코 h를 통과시키지 않습니다.

둘째, 사용자가 입력 한 실제 String을 반환하지 않으므로 항상 빈 문자열입니다.

셋째, 예상 된 패턴을 알고 있지만 입력을 알지 못하기 때문에이를 실제로 되돌릴 수 있고 입력을 패턴으로 검색하여 정규식 시작 부 (^)를 사용하여 순서를 지정할 수 있습니다. 이 같은

시도 뭔가 : 작동하지

private String last = ""; 

InputFilter onboardingFilter = new InputFilter() { 
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
     String sourceAsRegex = "^" + source; 
     String desiredInput = "hello"; 

     Pattern pattern = Pattern.compile(sourceAsRegex, Pattern.CASE_INSENSITIVE); 
     Matcher matcher = pattern.matcher(desiredInput); 

     if(matcher.find()) 
      last = source; 

     return last; 
    } 
}; 
+0

. 'last = ""'모든 입력에 대해 항상 – AnZ

+0

은 InputFilter의 인스턴스를 둘러싼 클래스의 멤버 여야합니다. 그것은 matcher.matches()가 true를 반환 할 때마다 현재 소스로 설정되고, 따라서 여러분은 통과 할 때 sourceAsRegex와 마지막 값이 (초기 상태에서) 각각 "^", "">> "^ h" , "h">> "^ he", "he">> 등등. 이제 내가 거기에 ap를 넣고, "^ hep"는 "hello"내에서 검색을 실패하고 마지막으로 설정하지 않기 때문에 " 그 "와 입력 필드가 변경되지 않은 채로 남아 있어야합니다. – Guardanis

+0

matcher.matches()를 matcher.find()로 바꾸어보십시오. 제대로 작동해야합니다. – Guardanis

관련 문제