EditText addTextChangedListener 仅用于用户输入

EditText addTextChangedListener only for user input

我有一个 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() 中的内容将被执行。现在,在同一个 activity 中,我有一个 ToggleButton,它可以更改 EditText 中的字符串。如何防止由于 ToggleButton 触发此文本更改 "afterTextChanged"?

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

我认为有两种可能:

  1. 注册/注销侦听器
  2. 旗帜

标记示例:

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
            }
        };
    }
}