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

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

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

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

Изображение
прописал вручную импорт import android.view.OnClickListener; но оно его не понимает и предлагает удалить как неиспользуемый.
win 7 32, android 2.3

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 29 июл 2012, 19:24

Это потому, что написал полностью android.view.OnClickListener.
Если бы написал OnClickListener, import был бы нужен.
PS: Кстати, он не предлагать удалить import, а говорит, что не может найти класс android.view.OnClickListener.
Возможно, чтитает, что у тебя обычный Java-проект, или это Android-проект под версию SDK, которая у тебя не установлена.
PPS: Не android.view.OnClickListener, а android.view.View.OnClickListener

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

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

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

Изображение
я об этом. здесь предлагает удалить неиспольщуемый
win 7 32, android 2.3

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

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

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

так что мне делать то?
win 7 32, android 2.3

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 29 июл 2012, 21:20

Так сказано же: Remove unused imports. (теперь имя класса ты написал правильно)
Горячая клавиша: Ctrl-Shift-O, после чего Ctrl-S - сохранить файл.
Или пиши в классе implements OnClickListener, без [android.view.]View - тогда import будет нужен.
Но есть ещё android.content.DialogInterface.OnClickListener (см. урок про диалоги) - поэтому, чтобы не было путаницы рекомендую писать View.OnClickListener и не использовать import

Rapiro
Сообщения: 4
Зарегистрирован: 29 июл 2012, 23:37

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

Сообщение Rapiro » 29 июл 2012, 23:45

у меня была такаяже ошибка
вылечилось так
btnAdd.setOnClickListener((OnClickListener) this);

помогите изучал урок с калькулятором
нет не одной ошибки

код MainActivity
package com.example.calc1;


import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.os.Bundle;
import android.text.TextUtils;


public class MainActivity extends Activity {
EditText etNum1;
EditText etNum2;
Button btnAdd;
TextView tvResult;
String oper = "";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// находим элементы
etNum1 = (EditText) findViewById(R.id.etNum1);
etNum2 = (EditText) findViewById(R.id.etNum2);

btnAdd = (Button) findViewById(R.id.btnAdd);

tvResult = (TextView) findViewById(R.id.tvResult);


// прописываем обработчик

btnAdd.setOnClickListener((OnClickListener) this);

}


public void onClick(View v) {
// TODO Auto-generated method stub
float num1 = 0;
float num2 = 0;
float result = 0;

// Проверяем поля на пустоту
if (TextUtils.isEmpty(etNum1.getText().toString())
|| TextUtils.isEmpty(etNum2.getText().toString())) {
return;
}

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

switch (v.getId()) {
case R.id.btnAdd:
oper = "+";
result = num1 + num2;
break;
}
;
// формируем строку вывода
tvResult.setText(num1 + " " + oper + " " + num2 + " = " + result);
}
}

запускаю и наглухо умирает эмулятор
пишет

The application ..... has stopped unexpectedly. Please try again
Что делать?
з.ы. я нуб )

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

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

Сообщение Finch » 29 июл 2012, 23:57

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

public class MainActivity extends Activity implements OnClickListener
//....

btnAdd.setOnClickListener(this);
CEO of a company R.id.team

Rapiro
Сообщения: 4
Зарегистрирован: 29 июл 2012, 23:37

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

Сообщение Rapiro » 30 июл 2012, 00:06

btnAdd.setOnClickListener(this);
так мне показывает ошибку и не дает сохранить

если полностью так
public class MainActivity extends Activity implements OnClickListener

//....

btnAdd.setOnClickListener(this);
то тот же результат The application ..... has stopped unexpectedly. Please try again

в консоль пишет
[2012-07-30 00:09:05 - Unexpected error while launching logcat. Try reselecting the device.] device not found
com.android.ddmlib.AdbCommandRejectedException: device not found
at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:752)
at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:373)
at com.android.ddmlib.Device.executeShellCommand(Device.java:462)
at com.android.ddmuilib.logcat.LogCatReceiver$1.run(LogCatReceiver.java:109)
at java.lang.Thread.run(Unknown Source)

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 30 июл 2012, 00:15

Когда ты пишешь так:

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

btnAdd.setOnClickListener((OnClickListener) this);
ты обещаешь копмилятору, что this будет типа OnClickListener, и компилятор успокаивается.
Но не исполняешь обещания, не написав

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

public class MainActivity extends Activity implements OnClickListener
поэтому программа и валится.
А если написать implements, компилятор сам приведёт this к типу OnClickListener и писать (OnClickListener) не нужно.

А без setOnClickListener() валится? мне кажется ошибка где-то в другом месте.
Последний раз редактировалось math64 30 июл 2012, 00:19, всего редактировалось 1 раз.

Rapiro
Сообщения: 4
Зарегистрирован: 29 июл 2012, 23:37

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

Сообщение Rapiro » 30 июл 2012, 00:19

написал так
public class MainActivity extends Activity implements OnClickListener

//....

btnAdd.setOnClickListener(this);
результат тотже The application ..... has stopped unexpectedly. Please try again

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

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

Сообщение Finch » 30 июл 2012, 00:34

ты на эмуле запускаешь или на железе?
у те6я лажа с подключением попро6уй перезагрузи все нафиг =)
если знаешь как пользовать adb kill-server то вперед, а еще Clean сделай
CEO of a company R.id.team

Rapiro
Сообщения: 4
Зарегистрирован: 29 июл 2012, 23:37

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

Сообщение Rapiro » 30 июл 2012, 08:49

adb kill-server то вперед, а еще Clean сделай
а можно по подробнее что это?можно линки на уроки или примеры

Roman
Сообщения: 22
Зарегистрирован: 23 авг 2012, 08:43

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

Сообщение Roman » 05 сен 2012, 21:18

Подскажите а почему не сработал метод исключения, когда идет деление на ноль

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

    case R.id.btnDiv:
      oper = "/";
      try {
      result = num1 / num2;
      }
      catch (ArithmeticException e) {
    	  tvResult.setText("division by zero");
    	  }

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 06 сен 2012, 00:24

Как вариант может быть другое исключение, к примеру одна из переменных num1 или num2 не инициализированы, тогда будет исключение NullPointerException, поскольку вы его не обрабатываете, но оно появляется в блоке try, то вы его и не увидите.
Я обычно, если обрабатываю конкретное исключение, но есть вероятность возникновения других исключений, всегда добавляю еще один catch (Exception e){...}
к примеру:

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

    case R.id.btnDiv:
      oper = "/";
      try {
      result = num1 / num2;
      }catch (ArithmeticException e) { //Обрабатываем деление на ноль
          tvResult.setText("division by zero");
      }catch (Exception e){ //Обрабатываем все остальное
          Log.e("MyLog", e.toString());
      }

Тогда, если выскочит еще какое исключение, помимо деления на ноль, то мы его увидим в LogCat;

ЗЫ Попробовал вызвать исключение делением на ноль, тоже не получилось, походу в JAVA допускается деление на ноль, выводил в лог результат получаем result = Infinity :)
А вот если использовать константы, к примеру, result = 5 / 0, то исключение генерируется.
Т.е. проверку деления на ноль, в данном случае можно делать так

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

if (Float.isInfinite(result))
{
tvResult.setText("division by zero");
}
Или, тупо, num2 проверять на 0

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

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

Сообщение math64 » 06 сен 2012, 09:25

Исключение возникает при делении на целый ноль. При делении на (double)0 и (float)0 получается Infinity. Так же будет по умолчанию и в C++.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

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

Сообщение AndreyI » 06 сен 2012, 10:07

Только деление целого на целый ноль дает исключение, все другие варианты дают infinity
Если infinity приводится к int то получаем 2147483648

В общем большой простор для скрытых багов.

Было дело, сталкивался с этим. Долго не мог найти ошибку в приложении (там было много сложных вычислений), при этом оно работало, но иногда результат получался неправильный. Только при тщательной трассировке я это infinity и увидел. Тогда просто исправил ошибку, но не стал особо заострять внимание, просто не было времени (много времени было убито на поиски этой ошибки). А вот если бы выпадало исключение, эту ошибку можно было найти за считанные минуты.
Ну да ладно, зато космические корабли и ракеты теперь не будут терять управление из-за деления на ноль :)

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 06 сен 2012, 10:43

AndreyI писал(а):Ну да ладно, зато космические корабли и ракеты теперь не будут терять управление из-за деления на ноль :)
Скажешь это когда из за infinity один из них тебе в окошко залетит :)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 17 сен 2012, 14:15

Здравствуйте,

Как говорится, чем дальше в лес, тем больше дров. На основе уже узнанного, попытался сделать простейший калькулятор на свой лад (два поля ввода для циферок, одно для арифм. значений (+, -, *, / ) одно для =, и одно для результата) Вроде получается, но возникает одна проблема, не могу получить значение переменной result из if при вызове case R.id.btnEq:(кнопка =)
Дает ноль, однако без if, значение отображается. Думаю, что т.к. переменная объявлена глобально, после того как num_a получила значение num, программа не может получить значение result и берет значение переменной объявленной по умолчанию (int result;), а это 0.

Просьба помочь,заодно прояснив вопрос, почему в switch оператор if ведет себя подобным образом.

В case R.id.btn_1:, он ведь возвращает значение num.
public class MainActivity extends Activity {

EditText etNum_1; // поле ввода первого значения
EditText et_sign; // поле ввода знака (+,-,*,/)
EditText etNum_2; // поле ввода второго значения
EditText et_equals; //поле ввода знака равно (=)
EditText etNum_3; //поле результата

ImageButton button_Add;
ImageButton button_Sub;

int num = 0;
int num_a = 0;
int result;

String textValue = "";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

etNum_1 = (EditText) findViewById(R.id.etNum_1);
et_sign = (EditText) findViewById(R.id.et_sign);
etNum_2 = (EditText) findViewById(R.id.etNum_2);
et_equals = (EditText) findViewById(R.id.et_equals);
etNum_3 = (EditText) findViewById(R.id.etNum_3);

button_Add = (ImageButton) findViewById(R.id.btnAdd); // кнопка сложения
button_Sub = (ImageButton) findViewById(R.id.btnDiv); // кнопка вычитания

etNum_1.setText("");
etNum_2.setText("");
etNum_3.setText("");
}

public void onButtonClick(View view) {

switch (view.getId()) {
case R.id.btnAdd:
et_sign.setText("+");

if (etNum_1.isFocused()) {
etNum_1.clearFocus();
etNum_2.isFocusable();
etNum_2.requestFocus();
} else {
etNum_2.isFocused();
etNum_2.clearFocus();
}

num_a = num;
break;

case R.id.btnEq:

et_equals.setText("=");

if (button_Sub.isActivated()) {

result = num_a + num;

}


etNum_3.isFocusable();
etNum_3.requestFocus();
etNum_3.setText("");
etNum_3.setText(Integer.toString(result));
etNum_3.clearFocus();

break;

case R.id.btn_1:

textValue = "";

if (etNum_1.isFocused()) {
etNum_1.setText(textValue + "1");
textValue = etNum_1.getText().toString();
num = Integer.parseInt(textValue);
} else {
etNum_2.setText(textValue + "1");
textValue = etNum_2.getText().toString();
num = Integer.parseInt(textValue);
}
break;

case R.id.btn_2:
textValue = "";
if (etNum_1.isFocused()) {
etNum_1.setText(textValue + "2");
textValue = etNum_1.getText().toString();
num = Integer.parseInt(textValue);
} else {
etNum_2.setText(textValue + "2");
textValue = etNum_2.getText().toString();
num = Integer.parseInt(textValue);
}
break;
}
}
}

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

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

Сообщение dil_android » 17 сен 2012, 14:18

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

public class MainActivity extends Activity {

EditText etNum_1; // поле ввода первого значения
EditText et_sign; // поле ввода знака (+,-,*,/)
EditText etNum_2; // поле ввода второго значения
EditText et_equals; //поле ввода знака равно (=)
EditText etNum_3; //поле результата

ImageButton button_Add;
ImageButton button_Sub;

int num = 0;
int num_a = 0;
int result;

String textValue = "";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

etNum_1 = (EditText) findViewById(R.id.etNum_1); 
et_sign = (EditText) findViewById(R.id.et_sign); 
etNum_2 = (EditText) findViewById(R.id.etNum_2); 
et_equals = (EditText) findViewById(R.id.et_equals); 
etNum_3 = (EditText) findViewById(R.id.etNum_3); 

button_Add = (ImageButton) findViewById(R.id.btnAdd); // кнопка сложения
button_Sub = (ImageButton) findViewById(R.id.btnDiv); // кнопка вычитания

etNum_1.setText("");
etNum_2.setText("");
etNum_3.setText("");
}

public void onButtonClick(View view) {

switch (view.getId()) {
case R.id.btnAdd:
et_sign.setText("+");

if (etNum_1.isFocused()) {
etNum_1.clearFocus();
etNum_2.isFocusable();
etNum_2.requestFocus();
} else {
etNum_2.isFocused();
etNum_2.clearFocus();
}

num_a = num;
break;

case R.id.btnEq:

et_equals.setText("=");

if (button_Sub.isActivated()) {

result = num_a + num;

}

etNum_3.isFocusable();
etNum_3.requestFocus();
etNum_3.setText("");
etNum_3.setText(Integer.toString(result));
etNum_3.clearFocus();

break;

case R.id.btn_1:

textValue = "";

if (etNum_1.isFocused()) {
etNum_1.setText(textValue + "1");
textValue = etNum_1.getText().toString();
num = Integer.parseInt(textValue);
} else {
etNum_2.setText(textValue + "1");
textValue = etNum_2.getText().toString();
num = Integer.parseInt(textValue);
}
break;

case R.id.btn_2:
textValue = "";
if (etNum_1.isFocused()) {
etNum_1.setText(textValue + "2");
textValue = etNum_1.getText().toString();
num = Integer.parseInt(textValue);
} else {
etNum_2.setText(textValue + "2");
textValue = etNum_2.getText().toString();
num = Integer.parseInt(textValue);
}
break;
}
}
}

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

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

Сообщение damager82 » 19 сен 2012, 17:06

А зачем нужен этот if?
Я чет даже и не знаю, что такое isActivated ... Фокус чтоль?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Ответить