如何在EditText中仅检测用户的输入?

时间:2016-12-19 20:30:55

标签: java android concurrency java.util.concurrent

我有EditText和TextWatcher来监听这个视图。在TextWatcher内部我格式化特定的输入字符串。它再次调用我的TextWatcher,但我不想要它。我想只检测用户输入。所以,我尝试了很多方法来实现它,但它们没有任何效果。用户可以非常快速地输入文本,我无法在格式化文本时删除监听器,因为我丢失了任何事件。也许android框架有其他机制来监听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());
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用onUserInteractionListener方法?如果用户使用以下内容进行了交互,您可以尝试激活活动中的标记:

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