재훈재훈
SMS 문자 전송 화면 만들기 예제 ver.2 - 최대 바이트 수 제한 기능 본문
/*
SMS 문자 전송 화면 구성 ver.2
- 화면 상단에 텍스트 입력 상자, 아래쪽에 전송, 취소 버튼 위치
- 텍스트 입력상자 밑에 '00/00 바이트' 표시하여 바이트 수 제한하기
- 전송 버튼 누를 시 토스트로 글자 내용 알림
- 취소 버튼 누를 시 앱 종료
- 한글이 3바이트로 읽히는 문제 해결 - 2바이트로 읽힘
*/
MainActivity.java (xml 파일은 지난 번과 동일)
public class MainActivity extends AppCompatActivity {
EditText editText; // 메세지 입력 뷰
TextView textView; // 작성 글자 수 나타내는 뷰
Button button; // 작성 버튼
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText)
findViewById(R.id.editText);
// 뷰 지정
textView
= (TextView) findViewById(R.id.textView);
button = (Button)
findViewById(R.id.button);
editText.addTextChangedListener(new
TextWatcher() { //
addTextChangedListener 텍스트가 입력에 따라 변경될 때마다 확인하는 기능
// TextWatcher 텍스트가 변경될 때마다 발생하는 이벤트 처리하는 인터페이스
public void beforeTextChanged(CharSequence
s, int start, int count, int after) {}
public void onTextChanged(CharSequence
s, int start, int before, int count) {}
public void afterTextChanged(Editable
s) {
byte[]
currentText;
int textLength;
try {
currentText =
s.toString().getBytes("KSC5601"); // 현재 쓰여진 문자열의 바이트 배열 받아옴
textLength = currentText.length;
//
현재 쓰여진 문자열의 바이트 수
if(textLength > 80) {
s.delete(s.length() - 2, s.length() - 1); // st~en 까지 삭제
// 예를 들어 textLength가 81일
경우 80, 81번째 삭제함
currentText
= s.toString().getBytes("KSC5601"); // 바이트 수 제한에
맞춰 자른 문자열로 재정의
textLength = currentText.length;
}
String txt = String.valueOf(textLength)
+ " / 80 바이트";
textView.setText(txt);
//
텍스트뷰에 현재 바이트수 표시
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
});
}
public void onButton1Clicked(View
v) {
/*전송 버튼을 클릭하면 작성된 메시지를 토스트로 띄어준다.
editText.getText()의 반환형은 editable 이므로 CharSequence 타입으로 형변환해준다.*/
Toast.makeText(getApplicationContext(),
(CharSequence) editText.getText(), Toast.LENGTH_LONG).show();
}
public void onButton2Clicked(View v) {
finish();
}
지난 버전의 문제점 및 해결 방법
1. 바이트 제한이 불가능하였다.
editable.delete(int st, int en)를 이용해 글자 수가 80자가 넘을 시 초과된 글자들을 잘랐다.
2. 한글이 3바이트로 읽힌다.
인코딩 방식을 설정해주어야 했다. KSC5601 혹은 euc-kr 방식을 취하고 인코딩 예외처리를 추가했다.
궁금증
OnTextChanged와 AfterTextChanged의 차이를 실질적으로 느낄 수 없다. AfterTextChanged 의 내용을 그대로 OnTextChanged에 가져다 놓아도 기능은 거의 동일하게 작동된다. 텍스트 입력 중, 입력 후의 구분이 무엇인지 모르겠다.
'Computer Engineering > Android' 카테고리의 다른 글
FLAG_ACTIVITY_FORWARD_RESULT - 세번째 액티비티에서 첫번째 액티비티로 결과 전달하기 (0) | 2018.04.15 |
---|---|
고객 정보 입력 화면 만들기 예제 (1) | 2018.04.15 |
프래그먼트(Fragment) (0) | 2018.04.09 |
Intent로 데이터 전달하기 (0) | 2018.04.07 |
SMS 문자 전송 화면 만들기 예제 ver.1 - 글자 길이 제한 기능 (0) | 2018.04.07 |