Edittext에 "-"(대쉬, Dash)가 들어간 포맷을 만들고 싶다면?
728x90
반응형



물론 Edittext를 커스터마이징 하는 방법이 있다.

하지만 여러번 쓰이는 오브젝트가 아닌 이상 그럴 필요가 없다고 봤다.


다음과 같은 조건을 만족하는 Edittext를 만들어보자.

  1. 총 16자리 숫자 입력
  2. 4자리씩 "-"(Dash)로 끊어서 표현 
  3. 예시 : 1234-5555-6666-7890

단순하게 TextWatcher를 사용해서 입력하는 즉시 대쉬가 표현하면서 체크가 되게 하였다.
체크 사항은 입력값 뿐만 아니라 대쉬를 포함한 길이도 중요하다.


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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
edtInput.addTextChangedListener(new TextWatcher() {
 
    private int _beforeLenght = 0;
    private int _afterLenght = 0;
 
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        _beforeLenght = s.length();
    }
 
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (s.length() <= 0) {
            Log.d("addTextChangedListener""onTextChanged: Intput text is wrong (Type : Length)");
            return;
        }
 
        char inputChar = s.charAt(s.length() - 1);
        if (inputChar != '-' && (inputChar < '0' || inputChar > '9')) {
            edtInput.getText().delete(s.length() - 1, s.length());
            Log.d("addTextChangedListener""onTextChanged: Intput text is wrong (Type : Number)");
            return;
        }
        
        _afterLenght = s.length();
 
        // 삭제 중
        if (_beforeLenght > _afterLenght) {
            // 삭제 중에 마지막에 -는 자동으로 지우기
            if (s.toString().endsWith("-")) {
                edtInput.setText(s.toString().substring(0, s.length() - 1));
            }
        }
        // 입력 중
        else if (_beforeLenght < _afterLenght) {
            if (_afterLenght == 5 && s.toString().indexOf("-"< 0) {
                edtInput.setText(s.toString().subSequence(04+ "-" + s.toString().substring(4, s.length()));
            } else if (_afterLenght == 10) {
                edtInput.setText(s.toString().subSequence(09+ "-" + s.toString().substring(9, s.length()));
            } else if (_afterLenght == 15) {
                edtInput.setText(s.toString().subSequence(014+ "-" + s.toString().substring(14, s.length()));
            }
        }
        edtInput.setSelection(edtInput.length());
 
        if(s.length() == 19) {
            btnInput.setBackground(
                    ContextCompat.getDrawable(getContext(), R.drawable.btn_active));
        } else {
            btnInput.setBackground(
                    ContextCompat.getDrawable(getContext(), R.drawable.btn_inactive));
        }
 
    }
 
    @Override
    public void afterTextChanged(Editable s) {
        // 생략
    }
});
cs


입력 중일때 몇번째 입력중인지를 확인해서 대쉬가 입력이 되도록 했다.

또한 대쉬를 포함한 길이가 19개가 되면 버튼이 활성화가 되도록 하였다. (47번째줄)

이때 입력 혹은 삭제 전의 길이와 지금 길이를 비교하기 위해 beforeTextChanged에 길이값을 저장하고 있다.


참고 자료

  • http://lindseynoh.blogspot.com/2012/06/edittext-6.html


728x90
반응형