onTextChanged () не работает должным образом в EditText - PullRequest
0 голосов
/ 24 мая 2018

Моя цель состоит в том, чтобы в качестве исходного текста редактирования я использовал 0,00.После ввода одного числа ex-2, поэтому текст редактирования должен отображаться как - 0,02. Затем я ввожу второе число - текст редактирования 3 - должен показывать - 0,23. После следующего числа должен отображаться текст редактирования ex -5 - 2,35.код. Но это не работает, как ожидалось.Edittext не обновляется.

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

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы можете зарезервировать строку флага, чтобы указать, будет ли приходящий Редактируемый ввод из пользовательского интерфейса или из вашего кода.

       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) {

        }

    })
0 голосов
/ 24 мая 2018

Когда вы вызываете

text.setText(str);

внутри onTextChanged обратного вызова, этот TextView изменит текст еще раз, затем снова будет вызван onTextChanged.Там будет бесконечный цикл.

edit:

Вы можете добавить флаг bool для этого случая.Пример: isUserInput.

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

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...