2016-12-19 7 views
0

이 뷰를 수신하는 EditText 및 TextWatcher가 있습니다. TextWatcher 내부에서는 특정 입력 문자열을 형식화합니다. 그것은 내 TextWatcher를 다시 호출하지만, 나는 그것을 원하지 않는다. 사용자 입력 만 감지하고 싶습니다. 그래서 나는 그것에 도달하기 위해 많은 방법을 시도했지만 효과가 없었습니다. 사용자는 텍스트를 매우 빠르게 입력 할 수 있으며 어떤 이벤트도 느슨하기 때문에 형식 텍스트를 읽는 동안 리스너를 제거 할 수 없습니다. 어쩌면 안드로이드 프레임 워크는 EditText를 듣기위한 다른 메커니즘을 가지고 있을까요?EditText에서 사용자 입력 만 감지하는 방법은 무엇입니까?

코드. 이제이 코드는 작동하지 않습니다. 포맷하기 전에 청취자를 삭제하고 나중에 추가하거나 플래그를 사용할 수는 있지만 저에게는 효과적이지 않습니다.

public static class LoginWatcher implements TextWatcher { 

    private OnLoginEnterListener listener; 
    private LoginFilter loginFilter = new LoginFilter(); 
    private EditText target; 

    public LoginWatcher(OnLoginEnterListener onLoginInputListener) { 
     listener = onLoginInputListener; 
     target = listener.getTarget(); 
    } 

    @Override 
    public synchronized void afterTextChanged(Editable s) { 

     boolean isSymbolsChecked = loginFilter.check(s.toString()); 
     boolean isEmail = StringUtils.isEmailValid(s.toString()); 
     boolean isPhoneNumber = isPhoneNumber(s.toString()); 

     if ((isSymbolsChecked && isEmail) || isPhoneNumber) { 
      listener.onCorrectLoginEntered(s.toString()); 
      listener.onCheckedSymbolsEntered(s.toString()); 
     } else { 
      listener.onIncorrectLoginEntered(s.toString()); 
      if (isSymbolsChecked) { 
       listener.onCheckedSymbolsEntered(s.toString()); 
      } else { 
       listener.onUnsupportedSymbolsEntered(s.toString()); 
      } 
     } 

     if (isPhoneNumber) { 
      String formatted = formatPhoneNumber(s.toString()); 
      target.setText(formatted); 
      target.setSelection(formatted.length()); 
     } else { 
      String unformatted = unFormatPhoneNumber(s.toString()); 
      target.setText(unformatted); 
      target.setSelection(unformatted.length()); 
     } 
    } 
} 
+0

일부 코드를 추가 할 수 있습니까? 어떤 형식의 서식을 사용하고 있습니까? 어쩌면 거기에 몇 가지 구체적인 해결 방법이 있습니다. –

+0

@ VladimirJovanović, 위에 추가했습니다. – Timofey

+1

전화 번호가 이미 포맷되었거나 포맷되지 않았는지 확인하려고 했으므로 동일한 코드를 다시 부르지 않습니까? –

답변

0

onUserInteractionListener 메서드를 사용해 보셨습니까? 사용자가 다음과 같이 상호 작용 한 경우 활동에서 플래그를 활성화 해 볼 수 있습니다.

@Override 
public void onUserInteraction() { 
    super.onUserInteraction(); 
    userIsInteracting = true; 
}