editText에 문자 입력시 byte를 체크하여 해당 byte이상 입력하지 못하게 막는 방법입니다.
InputFilter로 검색하시면 많은 예제가 검색됩니다.
기존 예제로 적용을하면 하나씩 입력시에는 문제가 되지 않지만 많은 텍스트를 복사해서 붙여넣기시 제대로 체크가 되지 않는 문제가 생깁니다. 엔터를 체크하지 못하는 문제도 있습니다.
문자에 따라 byte가 다르기 때문에 생기는 문제인데.. 한글이 2byte이고, 숫자/영문이 1byte..
다량의 문자를 복사해서 붙여넣기 시 남는 바이트 만큼의 길이수를 구해 잘라내야 하는데.. 쉽지가 않더군요.
결국 while문으로 계속 돌려서 해당 byte를 맞춘 소스입니다. ㅋㅋ 완전 노가다~~
그래도 이렇게 하니까 해당 byte만큼 딱 잘라주네요.
체크하고자 하는 byte가 100byte를 넘어간다면 이 코드는 비추입니다.
//적용은 아래와 같이
InputFilter[] filters = new InputFilter[] {new ByteLengthFilter(80, "KSC5601")};Message_Body.setFilters(filters);
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) //keep -값이 나올경우를 대비한 방어코드
{
keep = 0;
}
int Rekeep = plusMaxLength(dest.toString(), source.toString(), start);
if (keep <= 0 && Rekeep <= 0) {
return ""; // source 입력 불가(원래 문자열 변경 없음)
} else if (keep >= end - start) {
return null; // keep original. source 그대로 허용
} else {
if( dest.length() == 0 && Rekeep <= 0 ) //기존의 내용이 없고, 붙여넣기 하는 문자바이트가 71바이트를 넘을경우
{
return source.subSequence(start, start + keep);
}
else if(Rekeep <= 0) //엔터가 들어갈 경우 keep이 0이 되어버리는 경우가 있음
{
return source.subSequence(start, start + (source.length()-1));
}
else
{
return source.subSequence(start, start + Rekeep); // source중 일부만입력 허용
}
}
}
/**
* 붙여넣기 시 최대입력가능한 길이 수 구하는 함수
* 숫자와 문자가 있을경우 길이수의 오차가 있음. While문으로 오차범위를 줄여줌
* @param expected : 현재 입력되어 있는 문자
* @param source : 붙여넣기 할 문자
* @param start
* @return
*/
protected int plusMaxLength( String expected, String source, int start ) {
int keep = source.length();
int maxByte = mMaxByte - getByteLength(expected.toString()); //입력가능한 byte
while (getByteLength(source.subSequence(start, start + keep).toString()) > maxByte) {
keep--;
};
return keep;
}
/**
* 입력가능한 최대 문자 길이(최대 바이트 길이와 다름!).
*/
protected int calculateMaxLength(String expected) {
int expectedByte = getByteLength(expected);
if (expectedByte == 0) {
return 0;
}
return mMaxByte - (getByteLength(expected) - expected.length());
}
/**
* 문자열의 바이트 길이. 인코딩 문자셋에 따라 바이트 길이 달라짐.
*
* @param str
* @return
*/
private int getByteLength(String str) {
try {
return str.getBytes(mCharset).length;
} catch (UnsupportedEncodingException e) {
}
return 0;
}
}
}
출처 : http://blog.naver.com/PostView.nhn?blogId=aiger&logNo=100130714496
[출처] [안드로이드]InputFilter EditText에 Byte제한걸기|작성자 세뮤렐
'Android' 카테고리의 다른 글
android http, https 통신 (0) | 2012.07.19 |
---|---|
androod EditText 검색 키보드 띄우기 (0) | 2012.07.08 |
Manifest portrait (0) | 2012.06.12 |
android.app.serviceconnectionleaked (0) | 2012.05.22 |
android 4.0에서 http통신을 할떄 주의할점. (0) | 2012.03.21 |