Android EditText addTextChangedListener仅用于用户输入

Android EditText addTextChangedListener仅用于用户输入,android,android-edittext,textwatcher,android-togglebutton,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(CharSeque

我有一个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中的字符串。如何防止由于切换按钮触发“后文本更改”而导致文本更改


PS:不确定这是否相关,但我有一个EditText,它接受小数或小数(例如“0.75”或“3/4”),切换按钮应在小数和小数显示之间切换,但不应触发“后文本更改”中的任何内容,因为值保持不变(3/4=0.75)我认为有两种可能性:

  • 注册/取消注册侦听器
  • 标志示例:

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

    简单的保持一个旗杆谢谢。工作起来很有魅力。由于“无法为最终变量赋值”和“变量是从内部类访问的,需要声明为最终变量”,我实际使用了
    final boolean[]automaticChanged={false}
    然后将值分配给
    automaticChanged[0]
    @user1583209我更改了我的代码,以帮助您避免变量访问问题。这似乎是逻辑解决方案,但由于侦听器的随机执行顺序,可能会产生问题。有没有更好的实现可以避免这些问题?