Я не могу изменить текст в EditText1 в ответ на изменение текста в EditText2

Я хочу, чтобы пользователь вводил температуру в градусах Цельсия и отображал температуру в градусах Фаренгейта и наоборот. Я думаю, что TextChangedListener идеально подходит для преобразования без нажатия кнопки. Значения продолжают изменяться по мере ввода пользователем.

Самая большая проблема, с которой я сталкиваюсь, заключается в том, что EditText не принимает никаких входных данных. В тот момент, когда я что-то ввожу, приложение принудительно закрывается. Пожалуйста, скажите мне, что не так. Вот мой код.

public class MainActivity extends ActionBarActivity {

EditText C, F;
Button exit;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    C = (EditText) findViewById(R.id.celsius);
    F = (EditText) findViewById(R.id.fahrenheit);
    exit = (Button) findViewById(R.id.exit);

    C.addTextChangedListener(new TextWatcher() {
        float f,c;

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

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            c = Float.parseFloat(s.toString());
            f = (((9 / 5) * c) + 32);
            F.setText((int) f);
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

    F.addTextChangedListener(new TextWatcher() {
        float f
                ,
                c;

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

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            f = Float.parseFloat(s.toString());
            c = ((f - 32) * (5 / 9));
            C.setText((int) c);
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });

}

}

Вот мой Логкэт.

01-25 00:55:35.486    7051-7051/com.jainchiranjeev.mylearning7.mylearning_7 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.jainchiranjeev.mylearning7.mylearning_7, PID: 7051
java.lang.StackOverflowError
        at android.text.SpannableStringBuilder.getChars(SpannableStringBuilder.java:915)
        at android.text.TextUtils.getChars(TextUtils.java:81)
        at android.text.method.ReplacementTransformationMethod$ReplacementCharSequence.getChars(ReplacementTransformationMethod.java:151)
        at android.text.TextUtils.getChars(TextUtils.java:81)
        at android.text.TextUtils.indexOf(TextUtils.java:114)
        at android.text.StaticLayout.generate(StaticLayout.java:187)
        at android.text.DynamicLayout.reflow(DynamicLayout.java:288)
        at android.text.DynamicLayout.<init>(DynamicLayout.java:174)
        at android.widget.TextView.makeSingleLayout(TextView.java:6205)
        at android.widget.TextView.makeNewLayout(TextView.java:6103)
        at android.widget.TextView.checkForRelayout(TextView.java:6752)
        at android.widget.TextView.setText(TextView.java:3850)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$2.onTextChanged(MainActivity.java:66)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$1.onTextChanged(MainActivity.java:45)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$2.onTextChanged(MainActivity.java:66)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$1.onTextChanged(MainActivity.java:45)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$2.onTextChanged(MainActivity.java:66)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$1.onTextChanged(MainActivity.java:45)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$2.onTextChanged(MainActivity.java:66)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(TextView.java:3708)
        at android.widget.EditText.setText(EditText.java:81)
        at android.widget.TextView.setText(TextView.java:3683)
        at com.jainchiranjeev.mylearning7.mylearning_7.MainActivity$1.onTextChanged(MainActivity.java:45)
        at android.widget.TextView.sendOnTextChanged(TextView.java:7610)
        at android.widget.TextView.setText(TextView.java:3853)
        at android.widget.TextView.setText(

person Chiranjeev Jain    schedule 24.01.2015    source источник
comment
принудительное закрытие приложения, вероятно, означает ошибку, поэтому logcat ошибки было бы неплохо отладить   -  person user2965003    schedule 24.01.2015
comment
пожалуйста, опубликуйте свой logcat.   -  person Moubeen Farooq Khan    schedule 24.01.2015
comment
есть 2 места, где, я думаю, может возникнуть ошибка № 1. f = Float.parseFloat(s.toString()); № 2. C.setText((int) с); для первого убедитесь, что в виде строки указано только число, для отладки укажите явное значение, например f = Float.parseFloat(35); и во-вторых, не используйте (int) кастинг afaik edittext принимает только текст и строку, а для отладки просто печатайте так. Значение: +c (это для отладки)   -  person Ahmad    schedule 24.01.2015
comment
TextView работал хорошо, как указывали некоторые добрые люди. Но знаете ли вы, как я могу реализовать это в EditText? На самом деле я работаю над приложением для преобразования чисел (двоичное, восьмеричное, шестнадцатеричное и десятичное). У меня есть несколько EditTexts. И я хочу, чтобы пользователь вводил любой номер и получал другие. Надеюсь, вы понимаете мой вопрос.   -  person Chiranjeev Jain    schedule 25.01.2015


Ответы (2)


Я бы реализовал два TextViews для отображения результата каждого вычисления. Сейчас вы создаете бесконечный цикл, когда изменение текста в первом EditText запускает ваш второй слушатель редактирования текстов onTextChanged и так далее. Отсюда и ошибка переполнения стека.

Измените свою реализацию, чтобы отображать каждый расчет EditText в TextView, тогда проблема исчезнет.

Короче говоря, добавьте свой TextView

TextView tv = (TextView)findViewById(R.id.textview);

и в вашем

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    c = Float.parseFloat(s.toString());
    f = (((9 / 5) * c) + 32);
    tv .setText(String.valueOf(f));
}
person Marcus    schedule 24.01.2015
comment
Проблема все еще сохраняется. Я просто не могу ввести какой-либо текст. Преобразование единицы является более поздним делом. Я разместил свой logcat, если это поможет. - person Chiranjeev Jain; 24.01.2015
comment
@Чиранджиев Джейн. Ах, я не видел последнюю часть вашего кода. Это просто логическая проблема. У вас есть два EditText с прослушивателем onTextChange. Если вы редактируете текст в первом, вы добавляете текст во втором. Но затем вы говорите второму изменить ваш текст в первом. Это будет бесконечный цикл, отсюда и ошибка stackoverflow. Вам нужно пересмотреть свою логику. - person Marcus; 24.01.2015
comment
Это сработало хорошо. Спасибо за помощь. Но знаете ли вы, как я могу реализовать это в EditText? На самом деле я работаю над приложением для преобразования чисел (двоичное, восьмеричное, шестнадцатеричное и десятичное). У меня есть несколько EditTexts. И я хочу, чтобы пользователь вводил любой номер и получал другие. Надеюсь, вы понимаете мой вопрос. - person Chiranjeev Jain; 25.01.2015
comment
@Chiranjeev Jain, вы должны создать для этого отдельный вопрос. Если этот ответ решил ваш текущий вопрос, отметьте его как ответ :-) - person Marcus; 25.01.2015

попробуй этот код

Я только что изучил документацию, и там написано, что

onTextChanged() не является местом для изменения текста EditText

вот ссылка на документацию, которую вы можете проверить оттуда

http://developer.android.com/reference/android/text/TextWatcher.html#onTextChanged%28java.lang.CharSequence,%20int,%20int,%20int%29

так что вы можете сделать, это переместить код после изменения текста.

C.addTextChangedListener(new TextWatcher() {
    float f
            ,
            c;

    @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 (!isAlpha(s.toString)){

            if(!s.toString().equals("")){

                c = Float.parseFloat(s.toString());
                f = (((9 / 5) * c) + 32);
                F.setText(""+ f);
             }
        }
    }
});

эта функция isAlpha предназначена для проверки того, ввел ли пользователь числовое значение или буквенное значение.

 public boolean isAlpha(String name) {
    return name.matches("[a-zA-Z]+");
}
person Moubeen Farooq Khan    schedule 24.01.2015
comment
Проблема все еще сохраняется. Я просто не могу ввести какой-либо текст. Преобразование единицы является более поздним делом. Я разместил свой logcat, если это поможет. - person Chiranjeev Jain; 24.01.2015
comment
@ChiranjeevJain Я обновил ответ, прочитал документ и изменил код, если он работает или нет, в обоих случаях. Спасибо. - person Moubeen Farooq Khan; 24.01.2015
comment
Это сработало хорошо. Спасибо за помощь. Но знаете ли вы, как я могу реализовать это в EditText? На самом деле я работаю над приложением для преобразования чисел (двоичное, восьмеричное, шестнадцатеричное и десятичное). У меня есть несколько EditTexts. И я хочу, чтобы пользователь вводил любой номер и получал другие. Надеюсь, вы понимаете мой вопрос. - person Chiranjeev Jain; 25.01.2015