EditText添加addTextChangedListener仅用于用户输入

7

我有一个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”),而toggle button应该在分数和十进制之间切换显示,并且不应该触发“afterTextChanged”,因为值保持不变(3/4=0.75)。

只需维护一个标志即可。 - Pavan
1个回答

11

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

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

谢谢。运行得很好。由于“无法为最终变量分配值”和“变量从内部类访问,需要声明为final”,我实际上使用了final boolean[] automaticChanged = {false};,然后将值分配给automaticChanged [0] - user1583209
@user1583209,我修改了我的代码,以帮助您避免变量访问的问题。 - Artur Szymański
这似乎是一个合乎逻辑的解决方案,但由于监听器的随机执行顺序可能会产生问题。是否有更好的实现方式可以避免这些问题呢? - bemeyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接