Search code examples
androidandroid-edittext

How to detect if users stop typing in EditText android


I have an EditText field in my layout. I want to perform an action when the user stops typing in that edittext field. I have implemented TextWatcher and use its functions

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }


@Override
public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { } 

@Override
    public void afterTextChanged(Editable editable) {

    }

The function onTextChanged and afterTextChanged get called just after typing any character, but I want to perform action after the user has finished typing in that edittext field, just like facebook does on it's "Check In" page.

How can I implement this?


Solution

  • This is how I did and works for me!

    long delay = 1000; // 1 seconds after user stops typing
    long last_text_edit = 0;
    Handler handler = new Handler();
    
    private Runnable input_finish_checker = new Runnable() {
        public void run() {
            if (System.currentTimeMillis() > (last_text_edit + delay - 500)) {
                // TODO: do what you need here
                // ............
                // ............
                DoStuff();
            }
        }
    };
    
    EditText editText = (EditText) findViewById(R.id.editTextStopId);
    editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged (CharSequence s,int start, int count,
        int after){
        }
        @Override
        public void onTextChanged ( final CharSequence s, int start, int before,
        int count){
            //You need to remove this to run only once
            handler.removeCallbacks(input_finish_checker);
    
        }
        @Override
        public void afterTextChanged ( final Editable s){
            //avoid triggering event when text is empty
            if (s.length() > 0) {
                last_text_edit = System.currentTimeMillis();
                handler.postDelayed(input_finish_checker, delay);
            } else {
    
            }
        }
    }
    
    );