Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

재훈재훈

SMS 문자 전송 화면 만들기 예제 ver.2 - 최대 바이트 수 제한 기능 본문

Computer Engineering/Android

SMS 문자 전송 화면 만들기 예제 ver.2 - 최대 바이트 수 제한 기능

jaehoonx2 2018. 4. 7. 17:51

/*

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에 가져다 놓아도 기능은 거의 동일하게 작동된다. 텍스트 입력 중, 입력 후의 구분이 무엇인지 모르겠다.