Страница 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 , а тебя наверное что то другое импортировано. В общем пересмотри, если не то что то другое =)