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

Обсуждение уроков
keeper
Сообщения: 1
Зарегистрирован: 06 янв 2013, 15:30

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

Сообщение keeper » 06 янв 2013, 15:40

Тупо скопировал код в Eclipse, вставил предлагаемые классы, но в эмуляторе не работает - циферки водятся, но после нажатия кнопок ничего не происходит.

UPD: разобрался.

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 10 янв 2013, 10:45

Всем привет) Хочу выразить благодарность сайту и Андрею и Резаку. я перевел свою программу из дельфи в андроид и усовершенствовал немного. Спасибо большое) и программа уже в маркетах амазона, самсунга, appslib и на сайте
http://interesnyi.ucoz.ru/index/proekt_ ... _quot/0-13
по данным admob уже 1008 закачек (впечетления). в программе пока 3 способа шифрования. она бесплатная. хочу сделать программу фоновым, что бы когда выделяют текст и появляется панель стандартный с кнопками копировать, вставить и тд или рядом или снизу появилься кнопка шифровать при нажатии которой появится уже прога. возможно ли это? и подскажите код чтоб создать фоновую программу. что то негде нет. написано в книге что можно создать но нет ни одного примера. Буду очень рад). если кому надо то могу выложить части кода из программы.

kotikkirill
Сообщения: 5
Зарегистрирован: 14 янв 2013, 00:04

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

Сообщение kotikkirill » 14 янв 2013, 00:11

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
не активируется автогенерация при нажатии ctlr+space, не понимаю как это исправить, или я что-то не так делаю?

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 14 янв 2013, 16:30

kotikkirill писал(а):

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
не активируется автогенерация при нажатии ctlr+space, не понимаю как это исправить, или я что-то не так делаю?

у тебя не закрыто тело. после закрытия ошибка и там система подсказывает что обьязательно нужно поставить ретурн. нажимая получаешь следующее

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// тут будет ваш код программы я так думаю, а false незнаю так оставить или нет) я только
// начал изучать)
return false;
}
// TODO Auto-generated method stub

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 14 янв 2013, 16:41

посоветуйте с чего начать? для того что бы уже существующую программа вызвать при возникновение события. надо код обработчика события которая будет отлавливать писать в отдельном файле? в какой папке должен он быть (в src или res) и какой формат? и воспользоваться этой статей?

kotikkirill
Сообщения: 5
Зарегистрирован: 14 янв 2013, 00:04

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

Сообщение kotikkirill » 14 янв 2013, 19:58

G_O_R писал(а): у тебя не закрыто тело. после закрытия ошибка и там система подсказывает что обьязательно нужно поставить ретурн. нажимая получаешь следующее
это я знаю, я имею ввиду, что когда я начинаю писать onOptionsItemSelected и нажимаю ctlr+space, у меня не вылазит окно с выбором и мне приходится писать все в ручную, хотя должна быть автогенерация

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 14 янв 2013, 20:19

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

Bahing308
Сообщения: 1
Зарегистрирован: 11 дек 2012, 23:15

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

Сообщение Bahing308 » 02 фев 2013, 19:38

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

Если текстовые поля не заполнены то возникает ошибка.
А как это избежать?

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

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

Сообщение rezak90 » 02 фев 2013, 19:40

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

Если текстовые поля не заполнены то возникает ошибка.
А как это избежать?
конструкция try/catch вам поможет
R.id.team
Политика на форуме запрещена

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

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

Сообщение damager82 » 05 фев 2013, 12:53

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

Если текстовые поля не заполнены то возникает ошибка.
А как это избежать?
Либо заранее проверяйте, что они у вас не пусты и выдавайте соответствующее сообщение юзеру
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Oleg34
Сообщения: 17
Зарегистрирован: 26 дек 2012, 15:41

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

Сообщение Oleg34 » 25 мар 2013, 10:41

Добрый всем день! Подскажите почему у меня в проекте не отображаются кнопки с цифрами? Проект скомпелировался без ошибок.
Вложения
14.png
14.png (130.43 КБ) 12555 просмотров

Аватара пользователя
Bellatrix
Сообщения: 5
Зарегистрирован: 28 мар 2013, 10:43

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

Сообщение Bellatrix » 28 мар 2013, 12:44

Здравствуйте. Написала калькулятор для простых расчетов и перевода систем счисления. Все основные функии работают, но возникли проблемы с дробными числами. При подсчете некоторых (но не всех), например 2,8+0,8 отображается вот такое число.
КалькуляторАндроид.JPG
КалькуляторАндроид.JPG (58.16 КБ) 12541 просмотр
При этом при расчете других дробных чисел, например 3,8+0,8 такого нет и отображается адекватное число.

Код(методы, не влияющие на расчет вставлять не стала):
public class MainActivity extends Activity implements OnClickListener{
RadioButton Bin,Oct,Dec,Hex;
EditText DataInput;
Button[] numButtons;
Button ButtonAdd;
Button ButtonSub;
Button ButtonMul;
Button ButtonDiv;
Button ButtonDot;
Button ButtonEqual;
Button ButtonC;
Button ButtonCE;
char oper=' ';

boolean fl; //метка для обновления переменной CurrentValue после нажатия любой из арифметических кнопок или равно
boolean SignRes;//метка первого присвоения
boolean SignOper; //метка для обнуления результата при наборе с кнопок, если до этого не была нажата арифметическая кнопка
boolean SignEqual; //метка для обнуления оператора, если до этого была нажата кнопка равно
boolean DivZero; //метка деления на ноль
boolean Sign2Oper; //метка обновления оператора, если было нажато два оператора подряд
double CurrentResult=1.8e+307;//максимально возможное число типа double
String CurrentValue="";
double CurrentNumber=0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//чтобы приложение было полноэкранным
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

// и без заголовка

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

DataInput=(EditText)findViewById(R.id.DataInput);
DataInput.setText("0");

//Создание массива кнопок с цифрами
numButtons=new Button[10];
numButtons[0]=(Button)findViewById(R.id.button10);
numButtons[1]=(Button)findViewById(R.id.button1);
numButtons[2]=(Button)findViewById(R.id.button2);
numButtons[3]=(Button)findViewById(R.id.button3);
numButtons[4]=(Button)findViewById(R.id.button4);
numButtons[5]=(Button)findViewById(R.id.button5);
numButtons[6]=(Button)findViewById(R.id.button6);
numButtons[7]=(Button)findViewById(R.id.button7);
numButtons[8]=(Button)findViewById(R.id.button8);
numButtons[9]=(Button)findViewById(R.id.button9);
// Обнаружение кнопок операций
ButtonAdd=(Button)findViewById(R.id.buttonAdd);
ButtonAdd.setTextSize(28);
ButtonAdd.setOnClickListener(this);
ButtonSub=(Button)findViewById(R.id.buttonSub);
ButtonSub.setTextSize(28);
ButtonSub.setOnClickListener(this);
ButtonMul=(Button)findViewById(R.id.buttonMul);
ButtonMul.setTextSize(28);
ButtonMul.setOnClickListener(this);
ButtonDiv=(Button)findViewById(R.id.buttonDiv);
ButtonDiv.setTextSize(28);
ButtonDiv.setOnClickListener(this);
//Кнопка десятичной точки, = и <-
ButtonDot=(Button)findViewById(R.id.buttonDot);
ButtonDot.setTextSize(28);
ButtonDot.setOnClickListener(this);
ButtonEqual=(Button)findViewById(R.id.buttonEqual);
ButtonEqual.setTextSize(28);
ButtonEqual.setOnClickListener(this);
ButtonC=(Button)findViewById(R.id.buttonDel);
ButtonC.setTextSize(28);
ButtonC.setOnClickListener(this);
ButtonCE=(Button)findViewById(R.id.buttonCE);
ButtonCE.setTextSize(28);
ButtonCE.setOnClickListener(this);

//Добавление слушателя цифровым кнопкам
for (int i=0;i<10;i++){
numButtons.setOnClickListener(this);
numButtons.setTextSize(28);
}
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return false;
}

// Исходный вид калькулятора
void initial(){
oper=' ';
CurrentValue="";
SignRes=false;
SignEqual=false;
CurrentResult=1.8e+307;
CurrentNumber=0;
DataInput.setText("0");
Dec.setChecked(true);
}

//Обработка десятичной точки
void Dot(){
if (CurrentValue.indexOf('.')<0) {
if (CurrentValue.length()!=0) {
CurrentValue+='.';
}
else CurrentValue="0.";
DataInput.setText(CurrentValue);
}
}

//Ввод цифр с кнопок
void InputNumber(int i){
if (CurrentValue=="0.") {//чтобы снять метку и заполнять значение после нажатия запятой после расчета о_О
fl=false;
Sign2Oper=false;
}
if (fl){ //Чтобы очистить окно калькулятора после нажатия арифметических клавиш
CurrentValue="";
fl=false;
Sign2Oper=false;//снятие метки арифметической клавиши
}
if (SignEqual) initial();//чтобы обнулить все значения, в случае если нажата кнопка равно и не нажата кнопка оператора
if (CurrentValue.length()!=0 || i!=0){//для того, чтобы запретить вывод нуля первой цифрой
if (CurrentValue.length()<15){
CurrentValue+=i; //для ограничение ввода 15-ю сиволами
DataInput.setText(CurrentValue);
}
else Toast.makeText(this, "Ограничение ввода 15 цифр", Toast.LENGTH_SHORT).show();
}


}

//Проверка результата
void InspectionResult(){
//Первое ли присвоение?
if (!SignRes){//после изменения значения метки-условие не сработает
SignRes=true;//Если первое-ставим метке значение true, затем присваиваем результат
if (CurrentValue=="") CurrentResult=0;
else CurrentResult=Double.parseDouble(CurrentValue);
}
}
//Метод проверки и обнуления меток для всех арифметических кнопок, для которых требуются два числа
void SignNullification(char operator){//В качестве аргумента передается оператор нажатой кнопки
//fl=true;//после нажатия почистить окно калькулятора и начать новый ввод переменной
if (SignEqual){
oper=' ';
SignEqual=false;
}
InspectionResult();
Calculation();
oper=operator;
fl=true;
}


//Расчет
void Calculation(){
InspectionResult();
if (CurrentValue!=""&&!DivZero) {
CurrentNumber=Double.parseDouble(CurrentValue);
DivZero=false;
}
else CurrentNumber=0;
switch(oper){
case '+':
CurrentResult+=CurrentNumber;
break;
case '-':
CurrentResult-=CurrentNumber;
break;
case '*':
CurrentResult*=CurrentNumber;
break;
case '/':
if(CurrentNumber!=0) CurrentResult/=CurrentNumber;
else {
Toast.makeText(this, "На ноль делить нельзя", Toast.LENGTH_SHORT).show();
DivZero=true;
}
break;
}
//Вывод результата в текстовое окно
void OutputResult(){
if (CurrentResult<1.8e+307){
if (CurrentResult%1==0){
if (CurrentResult<2147483647){ //максимальное число типа Integer
CurrentValue=""+(int)CurrentResult;
}
else{
CurrentValue=""+CurrentResult;
}
DataInput.setText(CurrentValue);
}
else {
CurrentValue=""+CurrentResult;
DataInput.setText(""+CurrentResult);
}
}
else {Toast.makeText(this, "Результат превышает допустимое значение", Toast.LENGTH_SHORT).show();
}
CurrentValue="";
}

//Слушатель событий
public void onClick(View arg0){

if (arg0==ButtonDot) Dot();

//Обработка ввода с кнопок
for (int i=0;i<10;i++) if (arg0==numButtons) InputNumber(i);

//Обработка математических операций
if (arg0==ButtonAdd) {
if (!Sign2Oper){//если до этого не было нажато никакого оператора-выполняется расчет
SignNullification('+');
OutputResult();
Sign2Oper=true;
}
oper='+';
}
if (arg0==ButtonSub) {
if (!Sign2Oper){//если до этого не было нажато никакого оператора-выполняется расчет
SignNullification('-');
OutputResult();
Sign2Oper=true;
}
oper='-';
}
if (arg0==ButtonMul) {
if (!Sign2Oper){//если до этого не было нажато никакого оператора-выполняется расчет
SignNullification('*');
OutputResult();
Sign2Oper=true;
};
oper='*';
}
if (arg0==ButtonDiv) {
if (!Sign2Oper){//если до этого не было нажато никакого оператора-выполняется расчет
SignNullification('/');
OutputResult();
Sign2Oper=true;
}
oper='/';
}

if (arg0==ButtonEqual){
InspectionResult();
Calculation();
OutputResult();
Sign2Oper=false;
DivZero=false;//снятие метки деления на ноль
SignEqual=true;
fl=true;//после нажатия почистить окно калькулятора и начать новый ввод переменной
}
}

В чем здесь может быть проблема?

Dangreon
Сообщения: 41
Зарегистрирован: 01 янв 2013, 15:52

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

Сообщение Dangreon » 28 мар 2013, 13:14

Подобные ошибки возникают из-за особенностей реализации вычислений дробных чисел (чисел с плавающей запятой) на выч. устройствах.
Чтобы это устранить , как один из вариантов, округлять до нужного значения. Либо использовать специально созданные классы для точных вычислений.
Какие есть в Java - не подскажу, но Вы можете поискать.

Oleg34
Сообщения: 17
Зарегистрирован: 26 дек 2012, 15:41

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

Сообщение Oleg34 » 09 май 2013, 11:16

Так все таки, кто нибудь подскажет, почему у меня не отображаются кнопки в запущенном проекте? Несколько раз переделывал, но все одно и тоже! Сам проект я прикрепил. Посмотрите пожалуйста, и если, что неправильно сделал, то исправьте. Заранее спасибо!
Вложения
VIZ_471_Calculator.zip
(910.51 КБ) 253 скачивания

=bor=
Сообщения: 267
Зарегистрирован: 21 мар 2013, 12:26

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

Сообщение =bor= » 09 май 2013, 12:12

Oleg34 писал(а):Так все таки, кто нибудь подскажет, почему у меня не отображаются кнопки в запущенном проекте? Несколько раз переделывал, но все одно и тоже! Сам проект я прикрепил. Посмотрите пожалуйста, и если, что неправильно сделал, то исправьте. Заранее спасибо!
В вашем проекте всё ОК, работает.
Вы, наверное, про кнопки цифр из скрина Bellatrix?
В вашем коде нет кнопок под цифры.
У неё код другой, в нём программно создаются кнопки:

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

//Создание массива кнопок с цифрами
numButtons=new Button[10];
	numButtons[0]=(Button)findViewById(R.id.button10);
	numButtons[1]=(Button)findViewById(R.id.button1);
	numButtons[2]=(Button)findViewById(R.id.button2);
	numButtons[3]=(Button)findViewById(R.id.button3);
	numButtons[4]=(Button)findViewById(R.id.button4);
	numButtons[5]=(Button)findViewById(R.id.button5);
	numButtons[6]=(Button)findViewById(R.id.button6);
	numButtons[7]=(Button)findViewById(R.id.button7);
	numButtons[8]=(Button)findViewById(R.id.button8);
	numButtons[9]=(Button)findViewById(R.id.button9);
Если хотите то же самое, используйте её код.

Oleg34
Сообщения: 17
Зарегистрирован: 26 дек 2012, 15:41

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

Сообщение Oleg34 » 09 май 2013, 13:54

Да я вроде все делал, как написано в уроке №19 http://startandroid.ru/ru/uroki/vse-uro ... jator.html
А в уроке про самостоятельное добавление кнопок ничего не написано.
Я тут другой код нашел. Пытался тоже написать калькулятор, но получаю ошибку:
[2013-05-09 14:57:26 - Calc_Oleg] Could not find Calc_Oleg.apk!
Хотя опять же, ошибок не выдает вроде.
Вложения
Calc_Oleg.zip
(436.71 КБ) 239 скачиваний

=bor=
Сообщения: 267
Зарегистрирован: 21 мар 2013, 12:26

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

Сообщение =bor= » 09 май 2013, 14:30

Oleg34 писал(а):Да я вроде все делал, как написано в уроке №19 http://startandroid.ru/ru/uroki/vse-uro ... jator.html
А в уроке про самостоятельное добавление кнопок ничего не написано.
В уроке не написано, в нём цифры вводятся с клавы компа, а девушка просто пошла дальше, программно сгенерировала кнопки.
Oleg34 писал(а):Я тут другой код нашел. Пытался тоже написать калькулятор, но получаю ошибку:
[2013-05-09 14:57:26 - Calc_Oleg] Could not find Calc_Oleg.apk! Хотя опять же, ошибок не выдает вроде.
Проект не смотрел, но вот это непонятно - противоречие:
получаю ошибку
и
ошибок не выдает
.

Oleg34
Сообщения: 17
Зарегистрирован: 26 дек 2012, 15:41

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

Сообщение Oleg34 » 09 май 2013, 14:33

Ну ничего не подчеркивает красным в самом проекте. Визуально все в порядке, но при компиляции сообщает, что нет .ark файла

=bor=
Сообщения: 267
Зарегистрирован: 21 мар 2013, 12:26

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

Сообщение =bor= » 09 май 2013, 15:32

Oleg34 писал(а):Ну ничего не подчеркивает красным в самом проекте. Визуально все в порядке, но при компиляции сообщает, что нет .ark файла
Это действительно так, у вас в директории \Calc_Oleg\bin\ calc_oleg.jar вместо calc_oleg.apk.
Правой кнопкой на проекте/Run as/Android Application.

Oleg34
Сообщения: 17
Зарегистрирован: 26 дек 2012, 15:41

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

Сообщение Oleg34 » 09 май 2013, 16:17

Блин, правой кнопкой на проекте/Run as/Android Application, тут же выскакивает следующее предупреждение: android library projects cannot be launched, делаю: правой кнопкой на проекте /Properties/ Android /Library/Add, но не получается ничего добавить. Может проще переделать по новому проект?
Вложения
1.png
1.png (213.39 КБ) 12938 просмотров

Ответить