Android Studio 如何在使用EditText.setText()时禁用textwWatcher?

fgw7neuy  于 2022-11-16  发布在  Android
关注(0)|答案(2)|浏览(181)

我正在一个android工作室项目中工作,我正在尝试制作一个数字系统转换器应用程序。我使用了2个EditTexts(二进制和十进制)。APP SCREENSHOT
在这里,我希望每当用户给予十进制EditText时,其相应的值应设置为二进制EditText,反之亦然。我已在每个EdtText中使用TextWatcher来计算用户何时更改输入字段中的值。但我遇到了一个问题,即每当向任何EditText输入内容时,应用程序都会崩溃。

用于十进制编辑文本的TextWatcher:-

TextWatcher textDec=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) {
            String binValue;
            String decString;
            decString = dec.getText().toString();
            if (decString.trim().equals("")) {
                binValue = "";
            }
            else {
                binValue = decToBinMain(decString);
            }
            if (bin.getText().toString()!=binValue) {
                textView4.setText(binValue);
                bin.setText(binValue);
            }
        }
    };

    dec.addTextChangedListener(textDec);

用于二进制EditText的文本观察器:-

TextWatcher textBin=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) {
        String binValue;
        String decString;
        binValue=bin.getText().toString();
        if(binValue.trim().equals("")){
            decString="";
        }
        else {
            decString = String.valueOf(binToDec(binValue));
        }
        if(!dec.getText().toString().equals(decString)) {
            textView.setText(decString);
            dec.setText(decString);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

bin.addTextChangedListener(textBin);

我不知道是什么问题,也不知道为什么应用程序在输入任何字段时会崩溃。但是,当我将相应的值设置为textView时,它确实工作得很完美。任何帮助都将不胜感激!!谢谢!!

ego6inou

ego6inou1#

您有一个循环呼叫:
十进制-〉bin -〉十进制-〉bin -〉十进制-〉bin
1.我会建议您从方法中提取一些代码,以使代码更具可读性,这是为了您自己。
1.在你做了之后,你可能会有一个比我更好的主意。而我的主意是有一面旗帜的:

// in the Activity

布尔更新=真;

//将此放入每个TextWatcher中

if(update) {
             // execute your code here
         };

         update = !update;
a5g8bdjr

a5g8bdjr2#

你可以在SO上看到我的答案。只是给予你一个解决方案的要点。设置一些标志(这个机制可以变化。你也可以看到人们想出的解决问题的不同方法)。在你的核心逻辑上看看那个标志是否被设置,如果是,就不要运行那个核心逻辑。
请参阅我在SO上的其他方法

相关问题