이 뷰를 수신하는 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());
}
}
}
일부 코드를 추가 할 수 있습니까? 어떤 형식의 서식을 사용하고 있습니까? 어쩌면 거기에 몇 가지 구체적인 해결 방법이 있습니다. –
@ VladimirJovanović, 위에 추가했습니다. – Timofey
전화 번호가 이미 포맷되었거나 포맷되지 않았는지 확인하려고 했으므로 동일한 코드를 다시 부르지 않습니까? –