EditText addTextChangedListener仅用于用户输入

时间:2015-10-21 11:17:03

标签: android android-edittext textwatcher android-togglebutton

我有一个EditText,我在那里听取文字的变化:

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {}

        @Override
        public void afterTextChanged(Editable s) {
            // do stuff
        }
    });

到目前为止这个工作正常,如果我在EditText中输入内容,就会执行afterTextChanged()中的内容。现在,在同一个活动中,我有一个ToggleButton,它可以改变EditText中的字符串。如何阻止此文本更改,因为ToggleButton会触发" afterTextChanged"?

PS:不确定这是否相关,但具体来说我有一个EditText接受小数或小数(例如" 0.75"或" 3/4")和切换按钮应该在小数和小数显示之间切换,但不应该触发" afterTextChanged"因为该值保持不变(3/4 = 0.75)。

1 个答案:

答案 0 :(得分:6)

在我看来,有两种可能性:

  1. 注册/取消注册听众
  2. 标志
  3. 标志示例:

    public class MainActivity extends AppCompatActivity{
        boolean automaticChanged = false;
        ToggleButton toggleButton;
        EditText editText;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
    
                //...
                toggleButton.setOnClickListener(onClickListener);
                editText.addTextChangedListener(textWatcher);
                //...
            }
    
            TextWatcher textWatcher = new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                    if (!automaticChanged) {
                        // do stuff
                    } else {
                        automaticChanged = false;
                    }
                }
            };
    
            View.OnClickListener onClickListener = new View.OnClickListener() {
                @Override
                public void onClick(View v)
                {
                    automaticChanged = true;
                    // do stuff
                }
            };
        }
    }