OnFocusChangeListener 가 제대로 작동을 안합니다.

조회수 4995회

EditText의 포커스가 풀릴 때 이메일 체크를 하려고 하는데요.

이메일을 입력하고 다른 EditText로 옮겨가면 한번은 정상적(정상이든 오류메세지를 보여주던)으로 작동을 합니다.

근데 이메일을 입력하는 EditText로 다시 돌아와서, 이메일 형식과 맞지 않게 수정을 하고 다른 EditText로 옮겨가면 에러 메세지를 보여주지 않습니다.

signup_email.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                String mailFormat = "^[_a-zA-Z0-9-\\.]+@[\\.a-zA-Z0-9-]+\\.[a-zA-Z]+$";
                if (hasFocus == false) {
                    String inputText = signup_email.getText().toString();
                    Pattern pattern = Pattern.compile(mailFormat);
                    Matcher matcher = pattern.matcher(inputText);
                    signup_email_layout.setErrorEnabled(false);
                    if (!matcher.matches())
                        signup_email_layout.setError("이메일 입력이 잘못되었습니다");
                }
            }
        });
  • 혹시 setError("이메일 입력이 잘못되었습니다"); 이 메시지가 계속 보여지기를 원하는건가요? 안드로이드 소스를 보니 해당 텍스트뷰에 포커스되어 있지 않으면 에러아이콘만 노출이 되고 포커스가 되어 있으면 에러메시지가 함께 보여지게 되어있습니다. 제가 테스트했던 에뮬에서는 위와같은 방식으로 잘 동작하는데 혹시 단말기에서 테스트 하신건지.. 다른 폰에서도 한번 테스트 해보세요. 기기마다 다를수도 있을것이란 생각이 드네요. 알 수 없는 사용자 2016.4.4 11:20
  • 제 질문이 너무 포괄적이었네요;; EditText에서 포커스가 풀리고 다시 EditText로 포커스가 돌아왔을 경우 로직이 적용안되는 것이 궁금했는데요. 원인은 찾은거같은데요. 우선 xml에서는 TextInputLayout안에 EditText 가 존재합니다. EditText에 어떠한 값을 넣고 포커스가 풀리게 되면 두가지의 경우가 생기는데요. 1. 언더라인에 검은색 줄이 생긴다(정확한 값) 2. 언더라인에 빨간줄이 생긴다(정확하지 않은 값, 꼭 에러메세지가 생기지는 않음) 검은색 줄의 경우 다시 포커스가 잡히더라도 로직이 적용됩니다. 근데 빨간줄이 생겼을 경우에는 다시 포커스가 잡혀도 로직(정확한 값을 입력 후 포커스가 풀리면 언더라인이 다시 검은색으로 변해야한다고 생각)이 적용이 안됩니다.... 김선우 2016.4.5 09:34

1 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    위의 코드로 저도 테스트를 해봤는데요 포커스 바뀔때마다 setOnFocusChangeListener 가 잘 호출되고 있습니다. setErrorEnabled(false); 함수에서는 뭘 수행하고 있나요? true로는 언제 설정해주나요? 플래그 셋팅이 잘못된것 같아요 :)

     signup_email.setOnFocusChangeListener(new View.OnFocusChangeListener() {
                @Override
                public void onFocusChange(View v, boolean hasFocus) {
                    String mailFormat = "^[_a-zA-Z0-9-\\.]+@[\\.a-zA-Z0-9-]+\\.[a-zA-Z]+$";
                    if (hasFocus == false) {
                        String inputText = signup_email.getText().toString();
                        Pattern pattern = Pattern.compile(mailFormat);
                        Matcher matcher = pattern.matcher(inputText);
                        if (!matcher.matches()) {
                            Log.d("TEST", "이메일이 맞지 않습니다."); // 저는 로그를 찍어봤는데요. 포커스 이동될때마다 로그가 잘 찍히고 있습니다. 
                        }
                    }
                }
            });
    
    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)