2014-12-22 3 views
1

내가 뭘하려는 건 NumberPicker처럼 EditText에 삽입 할 수있는 값의 범위를 제한하는 것입니다. NumberPicker를 사용하지 않는 이유는 무엇입니까? API 11이 필요하고 내 애플리케이션이 API 10 이상과 호환되기를 바랍니다. 범위를 1에서 120 사이로 설정했습니다. 사용자가 해당 범위를 벗어난 숫자를 입력하면 EditText의 텍스트가 15로 변경됩니다.addTextChangedListener에서 EditText의 텍스트를 변경하는 더 나은 방법

이 코드는 작동하지만 나는 이것이 최선의 방법은 아니라고 생각합니다. 이것을 구현하십시오.

final EditText ed = ((EditText) findViewById(R.id.editMinutes)); 
TextWatcher tw = new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

    @Override 
    public void afterTextChanged(Editable s) { 
     } 

    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     try { 
      int minutes = Integer.valueOf(s.toString()); 
      if (minutes < 1 || minutes > 120) { 
       ed.setText("15"); 
      } 
     } catch (NumberFormatException ex) { 
      ed.setText("15"); 
     } 
    } 
}; 
ed.addTextChangedListener(tw); 

어떻게 향상시킬 수 있습니까? 이 일을 더 훌륭하고 우아한 방법이 있습니까?

+2

IF 숫자 선택기를 원한다면 AOSP 소스 코드에 들어가서 번호 선택 도구를 찾아서 앱에 추가하십시오. 그것을 사용하십시오. 숫자 피커, 즉 GUI 구성 요소에만 하드웨어 지원이 필요하지 않습니다. https://gitorious.org/atrix-aosp/frameworks_base/source/d762f063be970033314d3f77194bfe5cb284b605:core/java/android/widget/NumberPicker.java –

+0

두 번째로, 코드가 단순한 것으로 보입니다. – user210504

+0

나는 ' 나는 외부 코드를 사용할 수 있다고 생각하지 않습니다. 적어도 그 크기는 아니야. –

답변

0

정규 표현식을 here에서 가져온 텍스트 감시자를위한

InputFilter filter= new InputFilter() { 
     public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 

       String checkMe = dest.toString()+ source.toString(); 
       Pattern pattern = Pattern.compile("([1-9][0-9]?|1[01][0-9]|120)"); 
       Matcher matcher = pattern.matcher(checkMe); 
       boolean valid = matcher.matches(); 
       if(!valid){ 
        Log.i("", "invalid"); 
        return ""; 
       }else{ 
        Log.i("", "valid less than 120"); 
       } 
      return null; 

     } 
    }; 

    EditText editText=(EditText)findViewById(R.id.editMinutes); 
    editText.setFilters(new InputFilter[]{filter}); 

더 우아한 코드를 정의하기 위해 입력 필터를 사용할 수 있습니다

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 */ 
    } 
}); 
관련 문제