2013-11-07 3 views
0

Я новичок в Android, и у меня проблема. Я пытаюсь выполнить некоторые числовые вычисления для некоторого текста, введенного в одно или несколько полей EditText (каждое поле имеет соответствующий алгоритм для определения результата), а затем сохраняет результат/результаты в некоторых текстовых видах, связанных с EditTexts. EditText1 связан с TextView1; EditText2 связан с TextView2. В моей программе будет десять EditTexts, каждый из которых имеет связанный TextView. Все или никакие из EditTexts могут содержать в себе некоторые числовые данные. Вычисление происходит после нажатия кнопки (с использованием andriod: onClick = "buttonPressed"), в этот момент любые EditTexts, которые имеют числовой ввод, должны извлекать и вычислять свои данные (с формулой, специфичной для этой части данных) с сохранением результата в специальном TextView в EditText.Ошибки, выполняющие числовые вычисления по данным EditText

Когда я использую только один EditText и один TextView, все в порядке. Данные из EditText правильно анализируются, вычисляются, и результат сохраняется в TextView. Вот код, в этом случае:

public void buttonPressed(View view) 
{ 
    if (editText1.getText() != null) 
     textView1.setText(Double.toString(Double.valueOf(editText1.getText().toString())/12)); 
} 

Однако, если я пытаюсь расширить этот код и использовать другой EditText и TextView вроде этого:

public void buttonPressed(View view) 
{ 
    if (editText1.getText() != null) 
     textView1.setText(Double.toString(Double.valueOf(editText1.getText().toString())/12)); 
    if (editText2.getText() != null) 
     textView2.setText(Double.toString(Double.valueOf(editText2.getText().toString())/107)); 
} 

я получаю некоторые ошибки, которые, кажется, указывают на разборе проблема. Вот выход LogCat (я не силен в интерпретации этого):

11-07 20:38:14.191: E/AndroidRuntime(1570): FATAL EXCEPTION: main 
11-07 20:38:14.191: E/AndroidRuntime(1570): java.lang.IllegalStateException: Could not execute method of the activity 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at android.view.View$1.onClick(View.java:3597) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at android.view.View.performClick(View.java:4202) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at android.view.View$PerformClick.run(View.java:17340) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at android.os.Handler.handleCallback(Handler.java:725) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at android.os.Handler.dispatchMessage(Handler.java:92) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at android.os.Looper.loop(Looper.java:137) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at dalvik.system.NativeStart.main(Native Method) 
11-07 20:38:14.191: E/AndroidRuntime(1570): Caused by: java.lang.reflect.InvocationTargetException 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at java.lang.reflect.Method.invoke(Method.java:511) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at android.view.View$1.onClick(View.java:3592) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  ... 11 more 
11-07 20:38:14.191: E/AndroidRuntime(1570): Caused by: java.lang.NumberFormatException: Invalid double: "" 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at java.lang.StringToReal.invalidReal(StringToReal.java:63) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at java.lang.StringToReal.parseDouble(StringToReal.java:248) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at java.lang.Double.parseDouble(Double.java:295) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at java.lang.Double.valueOf(Double.java:332) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  at com.example.breadmakingconversions.MainActivity.sendToConvert(MainActivity.java:160) 
11-07 20:38:14.191: E/AndroidRuntime(1570):  ... 14 more 

Я не понимаю, почему метод синтаксического анализа я использовал для выполнения расчетов по этим данным в EditText (я не был уверен, как это сделать это, но я нашел это путем большого количества проб и ошибок) должен работать для одного поля, но не для двух. Я пробовал много альтернативных способов сделать это за последние несколько часов и не могу понять это.

Любая помощь очень ценится!

Редактировать: Я забыл сказать, что все мои EditTexts имеют android: numeric = "decimal" (я знаю, что это устарело, но я все равно использую его здесь), так что у меня никогда не будет ввода, который не является числовым.

+0

вы могли бы просто поймать НФО, это объяснило бы пустой, а также неправильный формат, если не было. – njzk2

+0

Я довольно уверен, что editText1.getText() никогда не может вернуть значение null. – njzk2

ответ

0

Одно из ваших полей содержит пустую строку, а не null. Вы должны расширить условия, как это ...

if (editText1.getText() != null) 

быть что-то больше похоже на

if (editText1.getText() != null && !editText1.getText().toString().equals("")) 

поймать пустую строку случай. Есть также несколько более коротких способов написания этого. Возможно, вам понравится класс Apache StringUtils, который имеет методы под названием isEmpty и isBlank, которые могут вам пригодиться.

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

+1

Ваш метод не учитывает пробелы. Вы должны обрезать строку перед проверкой, является ли она пустой. Также Android имеет встроенный TextUtils для выполнения той же работы, что и StringUtils. –

+0

Проблема с пробелами была причиной того, что я упомянул 'isBlank'. Я бы никогда не написал все это с помощью 'trim' - я всегда использую один из методов StringUtils. Благодарим вас за заметку о «TextUtils»; Я не знал, что у Android это было. –

+0

Спасибо! Мне жаль, что я не могу согласиться с обоими ответами, поскольку они оба правильные, и я узнал кое-что от обоих. Однако моя ошибка проистекала из того факта, что я неправильно полагал, что null и «" были одинаковыми (так что я не тестировался на «»), но из вашего ответа я узнал, что «» - это пустая строка, что является чем-то другим , Еще раз спасибо всем, кто помог! – Kallaste

1

Вам просто нужно иметь предложение if вокруг преобразования, чтобы убедиться, что строка не пуста.

Ошибка, когда вы пытаетесь преобразовать пустую строку в двойную.

Изменить эту строку:

if(editText1.getText() != null){ 

To:

if(editText1.getText() != null && !TextUtils.isEmpty(editText1.getText().toString().trim())){ 

Теперь, если пользователь вводит номер нон в EditText, вы все еще будете иметь проблемы.

Положите оператор try/catch вокруг всего беспорядка, чтобы поймать NumberFormatExceptions.

Я просто добавить это заявление, потому что софы не допускают один символ издания, если заявление нуждается в другом! (Не) также

+1

getText возвращает редактируемый. вы пропустили toStrign – njzk2

+0

Хороший улов. Благодарю. –

+0

Если только номера являются законными вводами в EditText, я бы рекомендовал установить свойство android: inputType = "number" в EditText. –

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