728x90
반응형
물론 Edittext를 커스터마이징 하는 방법이 있다.
하지만 여러번 쓰이는 오브젝트가 아닌 이상 그럴 필요가 없다고 봤다.
다음과 같은 조건을 만족하는 Edittext를 만들어보자.
- 총 16자리 숫자 입력
- 4자리씩 "-"(Dash)로 끊어서 표현
- 예시 : 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(0, 4) + "-" + s.toString().substring(4, s.length())); } else if (_afterLenght == 10) { edtInput.setText(s.toString().subSequence(0, 9) + "-" + s.toString().substring(9, s.length())); } else if (_afterLenght == 15) { edtInput.setText(s.toString().subSequence(0, 14) + "-" + 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
반응형
'Android, iOS' 카테고리의 다른 글
Realm 파일. 너가 보고 싶다. (0) | 2019.01.11 |
---|---|
Dialog 테두리를 둥글게 하고 싶다. 엄청하고 싶다. (0) | 2018.09.27 |
Zxing. 커스텀하여 사용하기 (1) | 2018.09.21 |
Found data binding errors. import는 하셨습니까? (0) | 2018.08.10 |
버튼에서 본 애니메이션 효과. 나도 해보고 싶다. (0) | 2018.08.08 |
Comment