Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 17 дек 2018, 03:34

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 264 ]  На страницу 1, 2, 3, 4, 5 ... 14  След.
Автор Сообщение
 Заголовок сообщения: Урок 19. Пишем простой калькулятор
СообщениеДобавлено: 26 сен 2011, 03:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
В этом уроке мы:

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

Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 28 апр 2017, 10:56, всего редактировалось 9 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 10 янв 2012, 17:26 

Зарегистрирован: 09 янв 2012, 01:31
Сообщений: 11
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Мне кажется, что для калькулятора переменные лучше объявить - double, а не float. Вычисления больших чисел будут точнее.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 янв 2012, 14:47 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 14:45
Сообщений: 2386
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 321 раз.
Подскажите пожалуйста еще вот что. С проверкой деления на ноль проблем нет, но с проверкой на введенные значения, чтобы EditText's не были пустыми возникла сложность.
Код: [ Загрузить ] [ Скрыть ]
  1.       @Override 
  2.       public void onClick(View v) { 
  3.         // TODO Auto-generated method stub 
  4.         float num1 = 0; 
  5.         float num2 = 0; 
  6.         float result = 0; 
  7.          
  8.         //проверка на пустые строки 
  9.         if ((etNum1.getText().toString()=="")||(etNum2.getText().toString()=="")){ 
  10.               Toast.makeText(this, "Недопустимая операция", 1000).show(); 
  11.               return; 
  12.         } 
  13.  
  14.          //читаем EditText и заполняем переменные числами 
  15.         num1 = Float.parseFloat(etNum1.getText().toString()); 
  16.         num2 = Float.parseFloat(etNum2.getText().toString()); 
  17.  
  18.         // определяем нажатую кнопку и выполняем соответствующую операцию 
  19.         // в oper пишем операцию, потом будем использовать в выводе 
  20.         switch (v.getId()) { 
  21.         case R.id.btnAdd: 
  22.           oper = "+"; 
  23.           result = num1 + num2; 
  24.           break; 
  25.         case R.id.btnSub: 
  26.           oper = "-"; 
  27.           result = num1 - num2; 
  28.           break; 
  29.         case R.id.btnMult: 
  30.           oper = "*"; 
  31.           result = num1 * num2; 
  32.           break; 
  33.         case R.id.btnDiv: 
  34.             if (num2==0) { 
  35.                   Toast.makeText(this, "Деление на ноль недопустимо", 1000).show(); 
  36.                   etNum2.setText(""); 
  37.                   return; 
  38.             } 
  39.           oper = "/"; 
  40.           result = num1 / num2; 
  41.           break; 
  42.         default: 
  43.           break; 
  44.         } 
  45.          
  46.         // формируем строку вывода 
  47.         tvResult.setText(num1 + " " + oper + " " + num2 + " = " + result); 
  48.       } 

Провожу в начале проверку на пустые строки, но у меня программа не заходит в условие
Код: [ Загрузить ] [ Скрыть ]
  1.         //проверка на пустые строки 
  2.         if ((etNum1.getText().toString()=="")||(etNum2.getText().toString()=="")){ 
  3.               Toast.makeText(this, "Недопустимая операция", 1000).show(); 
  4.               return; 
  5.         } 

Пробовал через .equals("") , но результат тот же. Что-то на подобие isEmpty() в андроиде не нашел.

Кстати на счет Float было бы интересно узнать в общем, стоит ли его использовать, либо нет. Читал что приложения на андроиде занимают в 2, а то и в 4 раза больше своего исходника, поэтому думаю наверное есть смысл и Float использовать где необходимо, но при этом будут некоторые сложности с явным приведением типов для Java кода, где многие функции так или иначе идут с double. Хотя я точно и не знаю какие библиотеки использует Android из Java, кроме Java.net

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 янв 2012, 15:02 
Аватар пользователя

Зарегистрирован: 11 янв 2012, 11:02
Сообщений: 29
Откуда: Belarus
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Попробуй получить длину строки из каждого элемента, а затем проверять по этой переменной. Вот нашел пример:
Код: [ Загрузить ] [ Скрыть ]
  1. EditText loginText = (EditText)this.findViewById(R.id.login_name); 
  2.  
  3. Integer nameLen = 8; 
  4.  
  5. int len = loginText.length(); 
  6. if (len<=0) { 
  7. loginText.setError(getText(R.string.error_required)); 
  8. else if (len< nameLen) { 
  9. loginText.setError(getString(R.string.error_character_length, nameLen)); 
  10. else { 
  11. nameId = loginText.getText().toString(); 

_________________
--[+++++++<---->>-->+>+>+<<<<]
<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 янв 2012, 15:05 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
У меня сработала такая проверка
Код: [ Загрузить ] [ Скрыть ]
  1.         if ( TextUtils.isEmpty(etNum1.getText().toString()) ||  TextUtils.isEmpty(etNum2.getText().toString())) { 
  2.             return; 
  3.         } 

Добавлю ее в урок.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 янв 2012, 21:09 

Зарегистрирован: 12 янв 2012, 02:46
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Возможно, в форуме уже это обсуждалось, но повторение как говорится.
Подробнее, решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.
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){

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 янв 2012, 23:07 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Slavko писал(а):
решил немножко укоротить код и уменьшить католичество объектов путем другой настройки обработчика нажатия кнопки.


Да, код значительно уменьшается. Но у меня цель, чтобы читатели поняли и закрепили как можно лучше само понятие обработчика.

А, начиная урока с 50-го, я тоже перехожу на onClick.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 16 фев 2012, 23:08 

Зарегистрирован: 16 фев 2012, 23:04
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
А можно ли как-то заменить разделитель дробной части - вместо точки на запятую? Так русским людям привычнее...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 17 фев 2012, 13:31 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Alexgrig писал(а):
А можно ли как-то заменить разделитель дробной части - вместо точки на запятую? Так русским людям привычнее...


Как это сделать на уровне системы, я не знаю.

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

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 фев 2012, 13:04 

Зарегистрирован: 16 фев 2012, 23:04
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Сработало!


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 24 фев 2012, 21:17 

Зарегистрирован: 24 фев 2012, 21:09
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Подскажите как избавиться от таких результатов как: 5.3 - 2 = 3.3000002?

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 фев 2012, 03:05 

Зарегистрирован: 25 фев 2012, 12:22
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Огромное спасибо, за предоставленные уроки.
У меня вопрос один возник, как реализовать сохранение результата? я сделал так:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. private void saveText()
  2.         {
  3.          SharedPreferences sPref = getPreferences(MODE_PRIVATE);
  4.          Editor ed = sPref.edit();
  5.             ed.putString(SAVED_TEXT, tvResult.getText().toString());
  6.             ed.commit();
  7.             Toast.makeText(this, "Результат сохранён", 1000).show();
  8.                 // TODO Auto-generated method stub
  9.                
  10.         }

в результате после нажатия кнопи Сохранить, у меня в поле tvResult вместо, например 5+5 = 10, появляется 5+5=0, т.е. итоговое значение сбрасывается, подскажите пожалуйста


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 фев 2012, 10:53 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
AndrewGS писал(а):
Подскажите как избавиться от таких результатов как: 5.3 - 2 = 3.3000002?


Зря я тут Float взял.
Используйте BigDecimal, проблема должна решиться.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 фев 2012, 10:56 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
getsucks писал(а):
в результате после нажатия кнопи Сохранить, у меня в поле tvResult вместо, например 5+5 = 10, появляется 5+5=0, т.е. итоговое значение сбрасывается, подскажите пожалуйста


В этом коде содержимое поля tvResult не меняется. Где-то в другом месте ошибка.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 фев 2012, 16:07 

Зарегистрирован: 25 фев 2012, 12:22
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. // читаем EditText и заполняем переменные числами
  2.     num1 = Float.parseFloat(etNum1.getText().toString());
  3.     num2 = Float.parseFloat(etNum2.getText().toString());
  4.  
  5.     // определяем нажатую кнопку и выполняем соответствующую операцию

Решил.
Мне не хватало строчки result = Float.valueOf(num1+num2);


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 25 июн 2012, 20:50 

Зарегистрирован: 22 июн 2012, 06:09
Сообщений: 14
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
а как сделать сложный калькулятор.
например в edittext пишется 340+456-900
жмем enter и получается результат?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 июн 2012, 15:14 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
top писал(а):
а как сделать сложный калькулятор.
например в edittext пишется 340+456-900
жмем enter и получается результат?


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

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 14 июл 2012, 20:12 

Зарегистрирован: 13 июл 2012, 11:54
Сообщений: 2
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Заменил 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());


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 июл 2012, 18:05 

Зарегистрирован: 13 июн 2012, 02:29
Сообщений: 12
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Изображение
странно. Из-за чего бы это?

_________________
win 7 32, android 2.3


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 июл 2012, 18:18 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Eshkin-Kat писал(а):
Изображение
странно. Из-за чего бы это?

скорее всего импорт не правильный произвёл, пересмотри импортируемые классы. Кажется должно быть View.OnClickListener , а тебя наверное что то другое импортировано. В общем пересмотри, если не то что то другое =)

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 264 ]  На страницу 1, 2, 3, 4, 5 ... 14  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB