android.text.InputFilter를 이용해서 사용자의 텍스트입력을 다양한 방식으로 필터링할 수 있습니다.

입력문자를 모두 대문자로 바꾸거나(InputFilter.AllCaps 이용), 문자열의 길이를 제한(InputFilter.LengthFilter 이용)할 수 있죠. 그밖에 다양한 필터를 만들 수 있을 겁니다. (정규식을 적용한 필터 예제 : http://flysky.thoth.kr/blog/4208673)

그런데 안드로이드가 기본으로 제공하는 InputFilter.LengthFilter는, 글자수(캐릭터 수)로 문자열의 길이를 계산하기 때문에 바이트 수로 길이를 제한하고 싶은 경우에는 사용할 수 없습니다. (한글처럼 문자열에 non-ascii 글자가 포함되면 글자 수 < 바이트 수).

아래 ByteLengthFilter는 바이트 길이로 입력을 제한해주는 필터입니다.

 
  
import java.io.UnsupportedEncodingException;

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에는 이렇게 적용하면 됩니다.

private static final int MAX_BYTE = ...;
EditText editText = ...;


InputFilter[] filters = new InputFilter[] {new ByteLengthFilter(MAX_BYTE, "KSC5601")};
editText.setFilters(filters);

크리에이티브 커먼즈 라이선스
Creative Commons License

 

 

출처 : http://ecogeo.tistory.com/295

2 댓글

고맙습니다.,

2013-01-22 19:33:36

님 강의 넘 좋아서 제가 막 퍼가요 ㅠㅠ 출처는 남기는데 허락해주실수있나여

MFam

2013-01-23 16:27:27

출처는 아래 명시해 두었습니다. ㅎㅎ 제가 원문이 아니에요~

크리에이티브 커먼즈 라이센스에 비영리 변경금지로 퍼갈 수 있다고 하니 ㅎㅎ 비영리 목적이시면 퍼가셔도 될 것 같습니다.

댓글 쓰기

문서 첨부 제한 : 0Byte/ 2.00MB
파일 크기 제한 : 2.00MB (허용 확장자 : *.*)

목록

Page 1 / 9
번호 제목 글쓴이 날짜 조회 수
공지

http://www.MFamStory.com 입니다.

| ETC 6
MFam 2010-11-03 47515
95

Android Studio로 작업하면서 새로이 사용했던 Lib들 간략 소개

| Android 1
MFam 2016-07-05 167
94

Android Media Database에서 image 조회할 때 gif 제외...

| Android
MFam 2016-07-05 139
93

openGL 2.0 Bitmap Load 실패하는 경우, 하드웨어 가속 끄기

| Android
MFam 2016-05-26 118
92

Volley, Retrofit 비교. 어떤거 사용할까 고민중

| Android
MFam 2016-05-23 105
91

2016년 5월 19일자 구글 로그인 구현(Google Login)

| Android
  • file
MFam 2016-05-19 128
90

안드로이드/Android 루팅 여부 확인 하기

| Android
MFam 2014-10-23 306
89

서비스(Service) 와 관련된 내용

| Android
MFam 2013-05-21 534
88

EditText 바이트 길이로 글자수 제한 InputFilter 활용

| Android 2
MFam 2013-01-09 858
87

SQLite 의 기본 기능들과 이해

| Android
MFam 2012-12-10 1387
86

PackageName으로 App 설치 여부 확인, 설치된 App의 PackageName List 뽑아내기

| Android
MFam 2012-11-07 724
85

해상도별 스크린 레이아웃

| Android 1
MFam 2012-10-24 1270