Урок 19. Пишем простой калькулятор

Обсуждение уроков
Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Урок 19. Пишем простой калькулятор

Сообщение damager82 » 26 сен 2011, 03:00

В этом уроке мы:

- пишем приложение - калькулятор

Click here to read this article!
Последний раз редактировалось damager82 28 апр 2017, 10:56, всего редактировалось 9 раз.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

tyapavel
Сообщения: 11
Зарегистрирован: 09 янв 2012, 01:31

Re: Урок 19. Пишем простой калькулятор

Сообщение tyapavel » 10 янв 2012, 17:26

Мне кажется, что для калькулятора переменные лучше объявить - double, а не float. Вычисления больших чисел будут точнее.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: Урок 19. Пишем простой калькулятор

Сообщение Mikhail_dev » 11 янв 2012, 14:47

Подскажите пожалуйста еще вот что. С проверкой деления на ноль проблем нет, но с проверкой на введенные значения, чтобы 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

Аватара пользователя
RagnarR
Сообщения: 29
Зарегистрирован: 11 янв 2012, 11:02
Откуда: Belarus

Re: Урок 19. Пишем простой калькулятор

Сообщение RagnarR » 11 янв 2012, 15:02

Попробуй получить длину строки из каждого элемента, а затем проверять по этой переменной. Вот нашел пример:

Код: Выделить всё

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();
}
--[+++++++<---->>-->+>+>+<<<<]
<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 19. Пишем простой калькулятор

Сообщение damager82 » 11 янв 2012, 15:05

У меня сработала такая проверка

Код: Выделить всё

	    if ( TextUtils.isEmpty(etNum1.getText().toString()) ||  TextUtils.isEmpty(etNum2.getText().toString())) {
	    	return;
	    }
Добавлю ее в урок.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Slavko
Сообщения: 6
Зарегистрирован: 12 янв 2012, 02:46

Re: Урок 19. Пишем простой калькулятор

Сообщение Slavko » 27 янв 2012, 21:09

Возможно, в форуме уже это обсуждалось, но повторение как говорится.
Подробнее, решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.
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){

все, результат тот же.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 19. Пишем простой калькулятор

Сообщение damager82 » 28 янв 2012, 23:07

Slavko писал(а): решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.
Да, код значительно уменьшается. Но у меня цель, чтобы читатели поняли и закрепили как можно лучше само понятие обработчика.

А, начиная урока с 50-го, я тоже перехожу на onClick.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Alexgrig
Сообщения: 2
Зарегистрирован: 16 фев 2012, 23:04

Re: Урок 19. Пишем простой калькулятор

Сообщение Alexgrig » 16 фев 2012, 23:08

А можно ли как-то заменить разделитель дробной части - вместо точки на запятую? Так русским людям привычнее...

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 19. Пишем простой калькулятор

Сообщение damager82 » 17 фев 2012, 13:31

Alexgrig писал(а):А можно ли как-то заменить разделитель дробной части - вместо точки на запятую? Так русским людям привычнее...
Как это сделать на уровне системы, я не знаю.

но можно к EditText добавить такое свойство: android:digits="0123456789.,"
Тогда он разрешит еще и запятую ставить. Ну и в коде потом replace(",", ".") делать, чтобы Float сработал.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Alexgrig
Сообщения: 2
Зарегистрирован: 16 фев 2012, 23:04

Re: Урок 19. Пишем простой калькулятор

Сообщение Alexgrig » 18 фев 2012, 13:04

Сработало!

AndrewGS
Сообщения: 1
Зарегистрирован: 24 фев 2012, 21:09

Re: Урок 19. Пишем простой калькулятор

Сообщение AndrewGS » 24 фев 2012, 21:17

Подскажите как избавиться от таких результатов как: 5.3 - 2 = 3.3000002?

PS Спасибо Вам за огромный труд. Всё красиво и доходчиво объясняете.

getsucks
Сообщения: 2
Зарегистрирован: 25 фев 2012, 12:22

Re: Урок 19. Пишем простой калькулятор

Сообщение getsucks » 27 фев 2012, 03:05

Огромное спасибо, за предоставленные уроки.
У меня вопрос один возник, как реализовать сохранение результата? я сделал так:

Код: Выделить всё

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, т.е. итоговое значение сбрасывается, подскажите пожалуйста

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 19. Пишем простой калькулятор

Сообщение damager82 » 27 фев 2012, 10:53

AndrewGS писал(а):Подскажите как избавиться от таких результатов как: 5.3 - 2 = 3.3000002?
Зря я тут Float взял.
Используйте BigDecimal, проблема должна решиться.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 19. Пишем простой калькулятор

Сообщение damager82 » 27 фев 2012, 10:56

getsucks писал(а):в результате после нажатия кнопи Сохранить, у меня в поле tvResult вместо, например 5+5 = 10, появляется 5+5=0, т.е. итоговое значение сбрасывается, подскажите пожалуйста
В этом коде содержимое поля tvResult не меняется. Где-то в другом месте ошибка.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

getsucks
Сообщения: 2
Зарегистрирован: 25 фев 2012, 12:22

Re: Урок 19. Пишем простой калькулятор

Сообщение getsucks » 27 фев 2012, 16:07

Код: Выделить всё

// читаем EditText и заполняем переменные числами
    num1 = Float.parseFloat(etNum1.getText().toString());
    num2 = Float.parseFloat(etNum2.getText().toString());

    // определяем нажатую кнопку и выполняем соответствующую операцию
Решил.
Мне не хватало строчки result = Float.valueOf(num1+num2);

top
Сообщения: 14
Зарегистрирован: 22 июн 2012, 06:09

Re: Урок 19. Пишем простой калькулятор

Сообщение top » 25 июн 2012, 20:50

а как сделать сложный калькулятор.
например в edittext пишется 340+456-900
жмем enter и получается результат?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 19. Пишем простой калькулятор

Сообщение damager82 » 29 июн 2012, 15:14

top писал(а):а как сделать сложный калькулятор.
например в edittext пишется 340+456-900
жмем enter и получается результат?
Тут только самому парсить строку ("340+456-900"), выделять цифры и операторы, и вычислять результат.
Хотя, наверняка уже есть готовые библиотеки, которые это умеют. Можно их поискать.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Андрей Д
Сообщения: 2
Зарегистрирован: 13 июл 2012, 11:54

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());

Eshkin-Kat
Сообщения: 12
Зарегистрирован: 13 июн 2012, 02:29

Re: Урок 19. Пишем простой калькулятор

Сообщение Eshkin-Kat » 29 июл 2012, 18:05

Изображение
странно. Из-за чего бы это?
win 7 32, android 2.3

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 19. Пишем простой калькулятор

Сообщение rezak90 » 29 июл 2012, 18:18

Eshkin-Kat писал(а):Изображение
странно. Из-за чего бы это?
скорее всего импорт не правильный произвёл, пересмотри импортируемые классы. Кажется должно быть View.OnClickListener , а тебя наверное что то другое импортировано. В общем пересмотри, если не то что то другое =)
R.id.team
Политика на форуме запрещена

Ответить