Страница 1 из 14
Урок 19. Пишем простой калькулятор
Добавлено: 26 сен 2011, 03:00
damager82
В этом уроке мы:
- пишем приложение - калькулятор
Click here to read this article!
Re: Урок 19. Пишем простой калькулятор
Добавлено: 10 янв 2012, 17:26
tyapavel
Мне кажется, что для калькулятора переменные лучше объявить - double, а не float. Вычисления больших чисел будут точнее.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 11 янв 2012, 14:47
Mikhail_dev
Подскажите пожалуйста еще вот что. С проверкой деления на ноль проблем нет, но с проверкой на введенные значения, чтобы EditText's не были пустыми возникла сложность.
Код: Выделить всё
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
float num1 = 0;
float num2 = 0;
float result = 0;
//проверка на пустые строки
if ((etNum1.getText().toString()=="")||(etNum2.getText().toString()=="")){
Toast.makeText(this, "Недопустимая операция", 1000).show();
return;
}
//читаем EditText и заполняем переменные числами
num1 = Float.parseFloat(etNum1.getText().toString());
num2 = Float.parseFloat(etNum2.getText().toString());
// определяем нажатую кнопку и выполняем соответствующую операцию
// в oper пишем операцию, потом будем использовать в выводе
switch (v.getId()) {
case R.id.btnAdd:
oper = "+";
result = num1 + num2;
break;
case R.id.btnSub:
oper = "-";
result = num1 - num2;
break;
case R.id.btnMult:
oper = "*";
result = num1 * num2;
break;
case R.id.btnDiv:
if (num2==0) {
Toast.makeText(this, "Деление на ноль недопустимо", 1000).show();
etNum2.setText("");
return;
}
oper = "/";
result = num1 / num2;
break;
default:
break;
}
// формируем строку вывода
tvResult.setText(num1 + " " + oper + " " + num2 + " = " + result);
}
Провожу в начале проверку на пустые строки, но у меня программа не заходит в условие
Код: Выделить всё
//проверка на пустые строки
if ((etNum1.getText().toString()=="")||(etNum2.getText().toString()=="")){
Toast.makeText(this, "Недопустимая операция", 1000).show();
return;
}
Пробовал через .equals("") , но результат тот же. Что-то на подобие isEmpty() в андроиде не нашел.
Кстати на счет Float было бы интересно узнать в общем, стоит ли его использовать, либо нет. Читал что приложения на андроиде занимают в 2, а то и в 4 раза больше своего исходника, поэтому думаю наверное есть смысл и Float использовать где необходимо, но при этом будут некоторые сложности с явным приведением типов для Java кода, где многие функции так или иначе идут с double. Хотя я точно и не знаю какие библиотеки использует Android из Java, кроме Java.net
Re: Урок 19. Пишем простой калькулятор
Добавлено: 11 янв 2012, 15:02
RagnarR
Попробуй получить длину строки из каждого элемента, а затем проверять по этой переменной. Вот нашел пример:
Код: Выделить всё
EditText loginText = (EditText)this.findViewById(R.id.login_name);
Integer nameLen = 8;
int len = loginText.length();
if (len<=0) {
loginText.setError(getText(R.string.error_required));
}
else if (len< nameLen) {
loginText.setError(getString(R.string.error_character_length, nameLen));
}
else {
nameId = loginText.getText().toString();
}
Re: Урок 19. Пишем простой калькулятор
Добавлено: 11 янв 2012, 15:05
damager82
У меня сработала такая проверка
Код: Выделить всё
if ( TextUtils.isEmpty(etNum1.getText().toString()) || TextUtils.isEmpty(etNum2.getText().toString())) {
return;
}
Добавлю ее в урок.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 27 янв 2012, 21:09
Slavko
Возможно, в форуме уже это обсуждалось, но повторение как говорится.
Подробнее, решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.
1. в компоновке main.xml после объявления каждой кнопки
<Button
добавил обработчик
android:onClick="myClick"
2. В коде MainActivity
удалил все объявления кнопок
// Button btnAdd;
// Button btnSub;
// Button btnMult;
// Button btnDiv;
инициализацию кнопок
// btnAdd = (Button) findViewById(R.id.btnAdd);
// btnSub = (Button) findViewById(R.id.btnSub);
// btnMult = (Button) findViewById(R.id.btnMult);
// btnDiv = (Button) findViewById(R.id.btnDiv);
удаляем вызов обработчика
// прописываем обработчик
// btnAdd.setOnClickListener(this);
// btnSub.setOnClickListener(this);
// btnMult.setOnClickListener(this);
// btnDiv.setOnClickListener(this);
3. Переименовываем
public void onClick(View v) {
в
public void myClick(View v){
все, результат тот же.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 28 янв 2012, 23:07
damager82
Slavko писал(а): решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.
Да, код значительно уменьшается. Но у меня цель, чтобы читатели поняли и закрепили как можно лучше само понятие обработчика.
А, начиная урока с 50-го, я тоже перехожу на onClick.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 16 фев 2012, 23:08
Alexgrig
А можно ли как-то заменить разделитель дробной части - вместо точки на запятую? Так русским людям привычнее...
Re: Урок 19. Пишем простой калькулятор
Добавлено: 17 фев 2012, 13:31
damager82
Alexgrig писал(а):А можно ли как-то заменить разделитель дробной части - вместо точки на запятую? Так русским людям привычнее...
Как это сделать на уровне системы, я не знаю.
но можно к EditText добавить такое свойство: android:digits="0123456789.,"
Тогда он разрешит еще и запятую ставить. Ну и в коде потом replace(",", ".") делать, чтобы Float сработал.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 18 фев 2012, 13:04
Alexgrig
Сработало!
Re: Урок 19. Пишем простой калькулятор
Добавлено: 24 фев 2012, 21:17
AndrewGS
Подскажите как избавиться от таких результатов как: 5.3 - 2 = 3.3000002?
PS Спасибо Вам за огромный труд. Всё красиво и доходчиво объясняете.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 27 фев 2012, 03:05
getsucks
Огромное спасибо, за предоставленные уроки.
У меня вопрос один возник, как реализовать сохранение результата? я сделал так:
Код: Выделить всё
private void saveText()
{
SharedPreferences sPref = getPreferences(MODE_PRIVATE);
Editor ed = sPref.edit();
ed.putString(SAVED_TEXT, tvResult.getText().toString());
ed.commit();
Toast.makeText(this, "Результат сохранён", 1000).show();
// TODO Auto-generated method stub
}
в результате после нажатия кнопи Сохранить, у меня в поле tvResult вместо, например 5+5 = 10, появляется 5+5=0, т.е. итоговое значение сбрасывается, подскажите пожалуйста
Re: Урок 19. Пишем простой калькулятор
Добавлено: 27 фев 2012, 10:53
damager82
AndrewGS писал(а):Подскажите как избавиться от таких результатов как: 5.3 - 2 = 3.3000002?
Зря я тут Float взял.
Используйте BigDecimal, проблема должна решиться.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 27 фев 2012, 10:56
damager82
getsucks писал(а):в результате после нажатия кнопи Сохранить, у меня в поле tvResult вместо, например 5+5 = 10, появляется 5+5=0, т.е. итоговое значение сбрасывается, подскажите пожалуйста
В этом коде содержимое поля tvResult не меняется. Где-то в другом месте ошибка.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 27 фев 2012, 16:07
getsucks
Код: Выделить всё
// читаем EditText и заполняем переменные числами
num1 = Float.parseFloat(etNum1.getText().toString());
num2 = Float.parseFloat(etNum2.getText().toString());
// определяем нажатую кнопку и выполняем соответствующую операцию
Решил.
Мне не хватало строчки result = Float.valueOf(num1+num2);
Re: Урок 19. Пишем простой калькулятор
Добавлено: 25 июн 2012, 20:50
top
а как сделать сложный калькулятор.
например в edittext пишется 340+456-900
жмем enter и получается результат?
Re: Урок 19. Пишем простой калькулятор
Добавлено: 29 июн 2012, 15:14
damager82
top писал(а):а как сделать сложный калькулятор.
например в edittext пишется 340+456-900
жмем enter и получается результат?
Тут только самому парсить строку ("340+456-900"), выделять цифры и операторы, и вычислять результат.
Хотя, наверняка уже есть готовые библиотеки, которые это умеют. Можно их поискать.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 14 июл 2012, 20:12
Андрей Д
Заменил float на double. Считать стал более точно. Пришлось еще поменять
num1 = Float.parseFloat(etNum1.getText().toString());
num2 = Float.parseFloat(etNum2.getText().toString());
на
num1 = Double.valueOf(etNum1.getText().toString());
num2 = Double.valueOf(etNum2.getText().toString());
Re: Урок 19. Пишем простой калькулятор
Добавлено: 29 июл 2012, 18:05
Eshkin-Kat
странно. Из-за чего бы это?
Re: Урок 19. Пишем простой калькулятор
Добавлено: 29 июл 2012, 18:18
rezak90
Eshkin-Kat писал(а):
странно. Из-за чего бы это?
скорее всего импорт не правильный произвёл, пересмотри импортируемые классы. Кажется должно быть View.OnClickListener , а тебя наверное что то другое импортировано. В общем пересмотри, если не то что то другое =)