android.text.InputFilter를 이용해서 사용자의 텍스트입력을 다양한 방식으로 필터링할 수 있습니다.
입력문자를 모두 대문자로 바꾸거나(InputFilter.AllCaps 이용), 문자열의 길이를 제한(InputFilter.LengthFilter 이용)할 수 있죠. 그밖에 다양한 필터를 만들 수 있을 겁니다. (정규식을 적용한 필터 예제 : http://flysky.thoth.kr/blog/4208673)
그런데 안드로이드가 기본으로 제공하는 InputFilter.LengthFilter는, 글자수(캐릭터 수)로 문자열의 길이를 계산하기 때문에 바이트 수로 길이를 제한하고 싶은 경우에는 사용할 수 없습니다. (한글처럼 문자열에 non-ascii 글자가 포함되면 글자 수 < 바이트 수).
아래 ByteLengthFilter는 바이트 길이로 입력을 제한해주는 필터입니다.
import android.text.InputFilter;
import android.text.Spanned;
/**
* EditText 등의 필드에 텍스트 입력/수정시
* 입력문자열의 바이트 길이를 체크하여 입력을 제한하는 필터.
*
*/
public class ByteLengthFilter implements InputFilter {
private String mCharset; //인코딩 문자셋
protected int mMaxByte; // 입력가능한 최대 바이트 길이
public ByteLengthFilter(int maxbyte, String charset) {
this.mMaxByte = maxbyte;
this.mCharset = charset;
}
/**
* 이 메소드는 입력/삭제 및 붙여넣기/잘라내기할 때마다 실행된다.
*
* - source : 새로 입력/붙여넣기 되는 문자열(삭제/잘라내기 시에는 "")
* - dest : 변경 전 원래 문자열
*/
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart,
int dend) {
// 변경 후 예상되는 문자열
String expected = new String();
expected += dest.subSequence(0, dstart);
expected += source.subSequence(start, end);
expected += dest.subSequence(dend, dest.length());
int keep = calculateMaxLength(expected) - (dest.length() - (dend - dstart));
if (keep <= 0) {
return ""; // source 입력 불가(원래 문자열 변경 없음)
} else if (keep >= end - start) {
return null; // keep original. source 그대로 허용
} else {
return source.subSequence(start, start + keep); // source중 일부만 입력 허용
}
}
/**
* 입력가능한 최대 문자 길이(최대 바이트 길이와 다름!).
*/
protected int calculateMaxLength(String expected) {
return mMaxByte - (getByteLength(expected) - expected.length());
}
/**
* 문자열의 바이트 길이.
* 인코딩 문자셋에 따라 바이트 길이 달라짐.
* @param str
* @return
*/
private int getByteLength(String str) {
try {
return str.getBytes(mCharset).length;
} catch (UnsupportedEncodingException e) {
//e.printStackTrace();
}
return 0;
}
}
EditText에는 이렇게 적용하면 됩니다.
int maxByte = ...;
EditText editText = ...;
InputFilter[] filters = new InputFilter[] {new ByteLengthFilter(maxByte, "KSC5601")};
editText.setFilters(filters);
'Android' 카테고리의 다른 글
[안드로이드] PhoneGap 앱에서 취소키 누르면 앱 종료하기 (0) | 2011.06.27 |
---|---|
[안드로이드] PhoneGap 플러그인 실행 메커니즘 (9) | 2011.06.24 |
[안드로이드] 자잘한 팁 모음 (0) | 2010.12.01 |
[안드로이드] 메소드 프로파일링(profiling or tracing) (3) | 2010.11.05 |
[안드로이드] GSM7 문자외에 다른 문자 포함여부 판단 코드 (0) | 2010.10.12 |