1

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

Самая большая проблема, с которой я сталкиваюсь, заключается в том, что 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) { 

     } 
    }); 

} 

}

Вот мой Logcat.

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(
+2

«приложение силы закрывает», вероятно, означает ошибку, так что ошибка LogCat было бы неплохо, чтобы отладить – user2965003

+0

любезно опубликовать LogCat. –

+0

Есть 2 места, где я думаю, ошибка может наступить # 1. f = Float.parseFloat (s.toString()); # 2. C.setText ((int) c); для первого убедитесь, что только число задано как строка для отладки питания, значение явно явно как f = Float.parseFloat («35»); и второй не использует (int) casting afaik edittext принимает только текст и строку, а для отладки просто печатает как это «Значение:» + c (это для отладки). – Ahmad

ответ

0

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

Измените свою реализацию, чтобы отобразить каждый расчет 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)); 
} 
+0

Проблема по-прежнему сохраняется. Я просто не могу ввести какой-либо текст. Преобразование устройства - это более поздняя вещь. Я отправил свой логарифм, если это поможет. –

+0

@ ChiranjeevJain. Ах, я не видел последнюю часть вашего кода. Это просто логическая проблема. У вас есть два EditTexts с помощью listerner onTextChange. Если вы редактируете текст в первом, вы добавляете текст во второй. Но потом вы говорите второму, чтобы изменить текст в первом. Это будет бесконечный цикл, следовательно, ошибка stackoverflow. Вам нужно пересмотреть свою логику. – Marcus

+0

Рассмотрите мой обновленный ответ. @ChiranjeevJain – Marcus

0

попробовать этот код

я только что изучил документацию и он говорит, что

OnTextChanged() не является местом для изменения х из EditText

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

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

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

функция
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, чтобы проверить, ввел ли пользователь числовое значение или alphabatic значение

public boolean isAlpha(String name) { 
    return name.matches("[a-zA-Z]+"); 
} 
+0

Проблема по-прежнему сохраняется. Я просто не могу ввести какой-либо текст. Преобразование устройства - это более поздняя вещь. Я отправил свой логарифм, если это поможет. –

+0

см. Мой обновленный ответ –

+0

@ChiranjeevJain У меня есть обновленный ответ, прочитайте документ и измените код, если он работает или не скажет, что в обоих случаях. Спасибо. –

Смежные вопросы