Android: почему я не могу изменить значение EditText по отношению к другому EditText?

Я собираюсь изменить текст edittext на основе значения, введенного в другом edittext. а также как то же самое с наоборот.

Для этого я использовал прослушиватель TextChanged и реализовал его, как показано ниже:

 includedText.addTextChangedListener(new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

                if(!(includedText.getText().toString().equals("")))
                {
                    double included = Double.parseDouble(includedText.getText().toString());
                    included = roundTwoDecimals(included);

                    String amt = String.valueOf(roundTwoDecimals(included-(included/1.15)));
                    String excluded = String.valueOf(included/1.15);
                    System.out.println("The Amount is: "+amt);
                    amountText.setText(amt);
                    excludedText.setText(excluded); //////// Error Line
                }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });


    // worked
    excludedText.addTextChangedListener(new TextWatcher() 
    {
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if(!(excludedText.getText().toString().equals("")))
            {
                double excluded = Double.parseDouble(excludedText.getText().toString());
                excluded = roundTwoDecimals(excluded);

                String amt = String.valueOf(roundTwoDecimals(excluded*0.15));
                String included = String.valueOf(roundTwoDecimals(excluded+(excluded*0.15)));
                System.out.println("The Amount is: "+amt);
                amountText.setText(amt);
                includedText.setText(included);
            }
        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    });
}

Но после этого я не могу изменить текст. для Secod EditText он работал хорошо, но пока я использую First EditText, он выдает ошибку в закомментированной строке.

Журнал ошибок:

12-22 13:08:17.640: ERROR/AndroidRuntime(1077): FATAL EXCEPTION: main
12-22 13:08:17.640: ERROR/AndroidRuntime(1077): java.lang.StackOverflowError
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.text.TextUtils.getChars(TextUtils.java:69)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.text.TextUtils.indexOf(TextUtils.java:102)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.text.StaticLayout.generate(StaticLayout.java:131)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.text.DynamicLayout.reflow(DynamicLayout.java:261)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.text.DynamicLayout.<init>(DynamicLayout.java:150)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.makeNewLayout(TextView.java:4851)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.checkForRelayout(TextView.java:5348)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2688)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:93)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2691)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$1.afterTextChanged(GSTActivity.java:74)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendAfterTextChanged(TextView.java:6145)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2695)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:93)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2691)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$1.afterTextChanged(GSTActivity.java:74)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendAfterTextChanged(TextView.java:6145)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2695)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:93)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2691)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$1.afterTextChanged(GSTActivity.java:74)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendAfterTextChanged(TextView.java:6145)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2695)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:93)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2691)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$1.afterTextChanged(GSTActivity.java:74)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendAfterTextChanged(TextView.java:6145)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2695)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTActivity$2.onTextChanged(GSTActivity.java:93)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.sendOnTextChanged(TextView.java:6131)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2691)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2556)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.EditText.setText(EditText.java:75)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at android.widget.TextView.setText(TextView.java:2531)
12-22 13:08:17.640: ERROR/AndroidRuntime(1077):     at com.project.TaxCalculator.GSTAct

Так что же в этом плохого? Почему я не могу получить эффект как для EditText? Спасибо.


person Shreyash Mahajan    schedule 22.12.2011    source источник
comment
не могли бы вы опубликовать сообщение об ошибке. ?   -  person Hardik4560    schedule 22.12.2011
comment
@ Hradik4560: см. Обновленный вопрос.   -  person Shreyash Mahajan    schedule 22.12.2011


Ответы (4)


это потому, что вы делаете setText() внутри onTextChanged . Поэтому, когда вы изменяете текст, будет вызываться onTextChanged, и снова внутри onTextChanged вы вызываете setText(). Таким образом, текст снова изменился, и onTextChanged() будет вызвана снова, и этот процесс будет продолжаться до тех пор, пока стек не переполнится и не приведет к ошибке stackOverFlow. Надеюсь, ты сможешь понять...

пользователь removeTextChangedListener() перед setText().

Изменить:

Определить
TextWatcher excludeTW,includeTW; //глобально.

    includedText = (EditText)findViewById(R.id.include);
    excludedText = (EditText)findViewById(R.id.exclude);

    includeTW = new TextWatcher(){

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
             if(!(includedText.getText().toString().equals("")))
                {
                    excludedText.removeTextChangedListener(excludeTW);
                    String included = includedText.getText().toString();
                    excludedText.setText(included); //////// Error Line
                }

        }



    };


    excludeTW = new TextWatcher(){

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
        includedText.removeTextChangedListener(includeTW);
        String excluded = excludedText.getText().toString();
        includedText.setText(excluded);

        }



    };
    includedText.addTextChangedListener(includeTW) ;
    excludedText.addTextChangedListener(excludeTW);
person Sujit    schedule 22.12.2011
comment
Тем не менее я не получаю ответа. Пожалуйста, вы поможете мне в этом? - person Shreyash Mahajan; 22.12.2011
comment
@Sujit: Не понимаю, я последовал тому же примеру, что и выше. Но addTextChangeListener работает для одного Edittext, но не работает для другого. Вот исходная ссылка, где я подробно задал проблему об этом ссылка Не могли бы вы взглянуть на это? - person Ishq Mehta; 10.03.2016

Я думаю, что это вызывает у вас проблемы, потому что вы помещаете весь код в рекурсию. то есть 1-й текст редактирования изменяет текст 2-го текста редактирования, который снова изменяет текст 1-го текста редактирования... это продолжается вечно..

Решение: примените некоторую логику, которая добавляет прослушиватель изменения текста, когда 1-й текст редактирования теряет фокус и наоборот.

Комментарий, если вам нужна помощь.

setOnTextChangeListener(true);

    excludedTextWatch = new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            if (!(excludedText.getText().toString().equals(""))) {
                double excluded = Double.parseDouble(excludedText.getText()
                        .toString());
                excluded = roundTwoDecimals(excluded);

                String amt = String
                        .valueOf(roundTwoDecimals(excluded * 0.15));
                String included = String.valueOf(roundTwoDecimals(excluded
                        + (excluded * 0.15)));
                System.out.println("The Amount is: " + amt);
                includedText.setText("" + included);
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    };

    includedTextWatch = new TextWatcher() {
        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {

            if (!(includedText.getText().toString().equals(""))) {
                double included = Double.parseDouble(includedText.getText()
                        .toString());
                included = roundTwoDecimals(included);

                String amt = String.valueOf(roundTwoDecimals(included
                        - (included / 1.15)));
                String excluded = String.valueOf(included / 1.15);
                System.out.println("The Amount is: " + amt);
                excludedText.setText("" + excluded); // ////// Error
                                                        // Line
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
        }

        @Override
        public void afterTextChanged(Editable s) {
        }
    };

    includedText.setOnFocusChangeListener(new OnFocusChangeListener() {

        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            excludedText.removeTextChangedListener(excludedTextWatch);
            includedText.removeTextChangedListener(includedTextWatch);
            setOnTextChangeListener(hasFocus);
        }
    });
}

private void setOnTextChangeListener(boolean shouldSetTheListener) {
    if (shouldSetTheListener) {
        includedText.addTextChangedListener(includedTextWatch);
    } else {
        excludedText.addTextChangedListener(excludedTextWatch);
    }
}

Это определенно сработает.

person Hardik4560    schedule 22.12.2011
comment
Что такое включенный TextWatch и исключенный TextWatch ?? - person Shreyash Mahajan; 22.12.2011
comment
Ваш ответ дает мне исключение nullPointerException в строке, которую я прокомментировал в вопросе. - person Shreyash Mahajan; 22.12.2011
comment
это произойдет, потому что вам нужно инициализировать текст редактирования, прежде чем использовать их. и includeTextWatch — это переменные, которые будут использоваться вместо анонимного внутреннего класса. Так что мы можем удалить их, когда они не нужны. - person Hardik4560; 22.12.2011
comment
Я инициализировал EditText следующим образом: amountText.setText(); // TextView excludeEditText.setText(); // EditText включенEditText.setText(); // Редактировать текст - person Shreyash Mahajan; 22.12.2011
comment
Но все же, пока я собираюсь изменить значение editTExt, это дает мне ошибку. - person Shreyash Mahajan; 22.12.2011
comment
Разве вы даже не знаете, как инициализировать объект представления. это делается с помощью метода findviewbyId, а не путем установки текста в пустую строку. - person Hardik4560; 23.12.2011

Кажется, вы подключили бесконечную рекурсию как к тексту редактирования.

onTextChanged() из includedText вызывает excludedText.setText(), который запускает onTextChanged для excludedText, который снова вызывает includedText.setText(). И это повторяется вечно, пока не рухнет.

Отсюда и Stackoverflow. См. здесь решение

Редактировать: я не компилировал его, просто отредактировал как есть. См. здесь

person st0le    schedule 22.12.2011
comment
Итак, что я должен изменить, чтобы сделать его эффективным и работать, как я сказал? - person Shreyash Mahajan; 22.12.2011
comment
Пожалуйста, помогите мне в моем состоянии. - person Shreyash Mahajan; 22.12.2011
comment
Спасибо st0le за ответ. и я только что решил вопрос с ответом Суджита. Но большое спасибо за помощь. - person Shreyash Mahajan; 22.12.2011
comment
@iDroidExplorer, на самом деле вы этого не сделали ... Попробуйте отредактировать текст во второй раз, это не сработает, в следующий раз. Если вы видите мой код, вам нужно снова добавить текстовый наблюдатель.... - person st0le; 22.12.2011

приведенный ниже код будет работать на 100 процентов, попробуйте объявить глобально TextWatcher t1, t2;

         final EditText myOutputBox = (EditText) ConvertView1.findViewById(R.id.editTextbackrate);

           myOutputBox.setRawInputType(Configuration.KEYBOARD_12KEY);

           final EditText myOutputBox1 = (EditText) ConvertView1.findViewById(R.id.edittextlayrate);

           myOutputBox.setRawInputType(Configuration.KEYBOARD_12KEY);

           myOutputBox1.addTextChangedListener(t1 = new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub


                   if(s.toString().equalsIgnoreCase(""))
                   {
                       myOutputBox.setText("");
                  }
                   else
                   {

                           myOutputBox.removeTextChangedListener(t2);

                           String x = myOutputBox1.getText().toString();
                           myOutputBox.setText(x);

                               }

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {


            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub




                myOutputBox.addTextChangedListener(t2 = new TextWatcher() {

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        // TODO Auto-generated method stub

                               if(s.toString().equalsIgnoreCase(""))
                               {
                                    Log.i("t2", "1");
                                   myOutputBox1.removeTextChangedListener(t1);
                                   myOutputBox1.setText("");

                               }
                               else
                               {




                                       myOutputBox1.removeTextChangedListener(t1);
                                       String x = myOutputBox.getText().toString();
                                       myOutputBox1.setText(x);


                                           }


                    }

                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count,
                            int after) {

                    }

                    @Override
                    public void afterTextChanged(Editable s) {

                    }
                }); 


            }
        }); 
person Dev    schedule 18.03.2015