1. hour에 있는 값을 모두 지우면 튕기고
=> editable.toString 값이 빈값인 "" 이 나올텐데. 이걸 Interger.parseInt() 로 부르니 처리 못 해서 Exception 발생 한 듯 합니다.
String message = editable.toString();
if (!TextUtil.isEmpty(message)) {
if(Interger.parseInt(message) {
....
}
와 같이 빈 값이 아닐 경우에만 이후 로직을 수행하게 하세요.
2. 13이상 값을 입력 받으면 "오후" "1" 이런 느낌으로 표시되야 되는데 13이상 값을 받아도 튕깁니다.
=> et_hour.setText(Integer.parseInt(editable.toString) -12); 부분이 문제입니다.
setText(int) 메소드가 호출 될텐데 이 메소드는 int 값이 설정 되는게 아니라 int 값에 해당하는 리소스 값이 설정됩니다.
즉 13입력 되면 리소스 Id가 1인 값을 설정하려 할텐데. 없으니 오류가 날 수 밖에 없습니다.
et_hour.setText(""+(Integer.parseInt(editable.toString) -12)); 나
et_hour.setText(Integer.toString(Integer.parseInt(editable.toString) -12)); 같이 명시적으로 String으로 변경 해 주셔야 합니다.
3. 추가적으로 24이상 값을 받았을때는 입력이 되지 않게도 만들고 싶은데 어떻게 구현해야할지 모르겠네요
=> 필터를 주시는게 깔끔 할 듯 합니다. 아래 경로를 확인 해 보세요.
https://stackoverflow.com/questions/14212518/is-there-a-way-to-define-a-min-and-max-value-for-edittext-in-android
PS. 지금 구조로는 텍스트 변경 이벤트를 부른 이후 setText 를 다시 부르시다보니 텍스트 변경 이벤트가 다시 불려 무한 루핑 걸릴 듯 합니다.
https://stackoverflow.com/questions/33257937/edittext-addtextchangedlistener-only-for-user-input 를 참조해서 사용자가 입력할 때만 처리하게 변경 하시는게 좋을 듯 합니다.