首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onTextChanged()在EditText中不能正常工作

onTextChanged()在EditText中不能正常工作
EN

Stack Overflow用户
提问于 2018-05-24 07:15:22
回答 3查看 3.9K关注 0票数 2

我的目的是以0.00开头我的编辑文本视图。在输入一个数字ex-2之后,编辑文本应该显示为- 0.02,然后我输入第二个ex- 3编辑文本应该显示- 0.23之后,下一个数字ex -5编辑文本应该显示- 2.35对于这个场景,我已经实现了小的code.But,它不像预期的那样工作。编辑文本不更新。

代码语言:javascript
复制
    public class MainActivity extends Activity {

    private EditText text;
    Character[] amount;
    int counter=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = (EditText)findViewById(R.id.text);
        text.setSelection(text.getText().length());
        amount =toCharacterArray(text.getText().toString());

        text.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) {
                System.out.println("test "+s);
                if(s.length()>0)
                {

                    if(counter==0 && s.length()>=5)
                    {
                        Log.e("Edit counter 1",String.valueOf(s) );
                        amount[3]=s.charAt(4);
                    }
                    else if (counter==1&& s.length()>=5)
                    {
                        Log.e("Edit counter 2",String.valueOf(s) );
                        amount[2]=amount[3];
                        amount[3]=s.charAt(4);
                    }
                    else if (counter==2 && s.length()>=5)
                    {
                        amount[0]=amount[2];
                        amount[2]=amount[3];
                        amount[3]=s.charAt(4);
                    }
                    else
                    {

                    }


                    String str = "";

                    for (Character c : amount)
                        str += c.toString();

                    System.out.println("Edit test "+str);


                   text.setText(str);

                }
                counter++;

            }

            @Override
            public void afterTextChanged(Editable s) {
                System.out.println(s.toString());


            }

        });
    }
    public Character[] toCharacterArray( String s ) {

        if ( s == null ) {
            return null;
        }

        int len = s.length();
        Character[] array = new Character[len];
        for (int i = 0; i < len ; i++) {
            array[i] = new Character(s.charAt(i));
        }

        return array;
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-24 07:27:01

当你打电话的时候

代码语言:javascript
复制
text.setText(str);

onTextChanged回调中,TextView将再次更改文本,然后再次调用onTextChanged。它会在那里造成无限的循环。

编辑:

您可以为这种情况添加一个bool标志。例:isUserInput.

代码语言:javascript
复制
    text.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) {
            System.out.println("test "+s);
            if(s.length()>0 && isUserInput)
            {

                if(counter==0 && s.length()>=5)
                {
                    Log.e("Edit counter 1",String.valueOf(s) );
                    amount[3]=s.charAt(4);
                }
                else if (counter==1&& s.length()>=5)
                {
                    Log.e("Edit counter 2",String.valueOf(s) );
                    amount[2]=amount[3];
                    amount[3]=s.charAt(4);
                }
                else if (counter==2 && s.length()>=5)
                {
                    amount[0]=amount[2];
                    amount[2]=amount[3];
                    amount[3]=s.charAt(4);
                }
                else
                {

                }


                String str = "";

                for (Character c : amount)
                    str += c.toString();

                System.out.println("Edit test "+str);


               text.setText(str);
               isUserInput = false;
            }else{
               isUserInput = true;
            }
            counter++;

        }
票数 3
EN

Stack Overflow用户

发布于 2018-05-24 08:05:30

您可以保留一个标志字符串,以指示来的可编辑是来自UI输入还是来自您的代码。

代码语言:javascript
复制
       findViewById<EditText>(R.id.editText).addTextChangedListener(object : TextWatcher {

        var lastString: String = ""

        override fun afterTextChanged(s: Editable?) {
            if (s.toString() == lastString) {
                return
            }
            //customized
            lastString = "${s.toString()}1"
            s?.replace(0, s.toString().length, lastString)
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {

        }

        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {

        }

    })
票数 1
EN

Stack Overflow用户

发布于 2020-07-07 07:09:32

是否为一致性更改而更改了其他后文本?

代码语言:javascript
复制
private Boolean isUserInput =true;

text.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) {
            System.out.println("test "+s);
            if(s.length()>0 && isUserInput)
            {

                if(counter==0 && s.length()>=5)
                {
                    Log.e("Edit counter 1",String.valueOf(s) );
                    amount[3]=s.charAt(4);
                }
                else if (counter==1&& s.length()>=5)
                {
                    Log.e("Edit counter 2",String.valueOf(s) );
                    amount[2]=amount[3];
                    amount[3]=s.charAt(4);
                }
                else if (counter==2 && s.length()>=5)
                {
                    amount[0]=amount[2];
                    amount[2]=amount[3];
                    amount[3]=s.charAt(4);
                }
                else
                {

                }


                String str = "";

                for (Character c : amount)
                    str += c.toString();

                System.out.println("Edit test "+str);


               text.setText(str);
               isUserInput = false;
            }
            counter++;

        }

 @Override
 public void afterTextChanged(Editable s) {       
         isUserInput = true;        
   }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50503223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档