Search code examples
androidandroid-textwatcher

How do you change an EditText on Android based on specific values inputted?


I want the user to change some device settings, for example run an alarm after X seconds (default 5s). I want the user to be able to type in what they want (number value from the edit text), but if the value they put in is not between 2s and 20s, I want the edit text to default back to 5s.

Whats the best way to do this? I tried with a watcher but i think I'm running into an infinite loop.

//Settings distance edit text
settings_distance_edit.addTextChangedListener(new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        int settings_distance_edit_value = Integer.parseInt(settings_distance_edit.getText().toString()+"");
        if (settings_distance_edit_value >= DISTANCE_MIN && settings_distance_edit_value <= DISTANCE_MAX) {
            Log.v("Tag", settings_distance_edit_value+"");

        } else {
            settings_distance_edit.setText(DISTANCE_DEFAULT+"");
        }
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

Solution

  • You should not use addTextChangedListener() for this purpose. You should wait for the user to hit the enter or done key on their keyboard. This can be achieved by the below code:

    settings_distance_edit.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH || actionId == EditorInfo.IME_ACTION_DONE || event != null && event.getAction() == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
                    if (event == null || !event.isShiftPressed()) {
                       // the user is done typing and has submitted the input. 
    
                       // your code
                       int settings_distance_edit_value = Integer.parseInt(settings_distance_edit.getText().toString()+"");
                       if (settings_distance_edit_value >= DISTANCE_MIN && settings_distance_edit_value <= DISTANCE_MAX) {
                          Log.v("Tag", settings_distance_edit_value+"");
    
                       } else {
                          settings_distance_edit.setText(DISTANCE_DEFAULT+"");
                       }
    
                       return true;
                    }                
                }
                return false; // the user has not submitted the input yet. 
        }
    });