Урок 19. Пишем простой калькулятор
-
- Сообщения: 12
- Зарегистрирован: 13 июн 2012, 02:29
Re: Урок 19. Пишем простой калькулятор
прописал вручную импорт import android.view.OnClickListener; но оно его не понимает и предлагает удалить как неиспользуемый.
win 7 32, android 2.3
Re: Урок 19. Пишем простой калькулятор
Это потому, что написал полностью android.view.OnClickListener.
Если бы написал OnClickListener, import был бы нужен.
PS: Кстати, он не предлагать удалить import, а говорит, что не может найти класс android.view.OnClickListener.
Возможно, чтитает, что у тебя обычный Java-проект, или это Android-проект под версию SDK, которая у тебя не установлена.
PPS: Не android.view.OnClickListener, а android.view.View.OnClickListener
Если бы написал OnClickListener, import был бы нужен.
PS: Кстати, он не предлагать удалить import, а говорит, что не может найти класс android.view.OnClickListener.
Возможно, чтитает, что у тебя обычный Java-проект, или это Android-проект под версию SDK, которая у тебя не установлена.
PPS: Не android.view.OnClickListener, а android.view.View.OnClickListener
-
- Сообщения: 12
- Зарегистрирован: 13 июн 2012, 02:29
Re: Урок 19. Пишем простой калькулятор
я об этом. здесь предлагает удалить неиспольщуемый
win 7 32, android 2.3
-
- Сообщения: 12
- Зарегистрирован: 13 июн 2012, 02:29
Re: Урок 19. Пишем простой калькулятор
Так сказано же: Remove unused imports. (теперь имя класса ты написал правильно)
Горячая клавиша: Ctrl-Shift-O, после чего Ctrl-S - сохранить файл.
Или пиши в классе implements OnClickListener, без [android.view.]View - тогда import будет нужен.
Но есть ещё android.content.DialogInterface.OnClickListener (см. урок про диалоги) - поэтому, чтобы не было путаницы рекомендую писать View.OnClickListener и не использовать import
Горячая клавиша: Ctrl-Shift-O, после чего Ctrl-S - сохранить файл.
Или пиши в классе implements OnClickListener, без [android.view.]View - тогда import будет нужен.
Но есть ещё android.content.DialogInterface.OnClickListener (см. урок про диалоги) - поэтому, чтобы не было путаницы рекомендую писать View.OnClickListener и не использовать import
Re: Урок 19. Пишем простой калькулятор
у меня была такаяже ошибка
вылечилось так
btnAdd.setOnClickListener((OnClickListener) this);
помогите изучал урок с калькулятором
нет не одной ошибки
код MainActivity
запускаю и наглухо умирает эмулятор
пишет
з.ы. я нуб )
вылечилось так
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
з.ы. я нуб )
Re: Урок 19. Пишем простой калькулятор
Код: Выделить всё
public class MainActivity extends Activity implements OnClickListener
//....
btnAdd.setOnClickListener(this);
CEO of a company R.id.team
Re: Урок 19. Пишем простой калькулятор
так мне показывает ошибку и не дает сохранитьbtnAdd.setOnClickListener(this);
если полностью так
то тот же результат The application ..... has stopped unexpectedly. Please try againpublic class MainActivity extends Activity implements OnClickListener
//....
btnAdd.setOnClickListener(this);
в консоль пишет
[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)
Re: Урок 19. Пишем простой калькулятор
Когда ты пишешь так:
ты обещаешь копмилятору, что this будет типа OnClickListener, и компилятор успокаивается.
Но не исполняешь обещания, не написав
поэтому программа и валится.
А если написать implements, компилятор сам приведёт this к типу OnClickListener и писать (OnClickListener) не нужно.
А без setOnClickListener() валится? мне кажется ошибка где-то в другом месте.
Код: Выделить всё
btnAdd.setOnClickListener((OnClickListener) this);
Но не исполняешь обещания, не написав
Код: Выделить всё
public class MainActivity extends Activity implements OnClickListener
А если написать implements, компилятор сам приведёт this к типу OnClickListener и писать (OnClickListener) не нужно.
А без setOnClickListener() валится? мне кажется ошибка где-то в другом месте.
Последний раз редактировалось math64 30 июл 2012, 00:19, всего редактировалось 1 раз.
Re: Урок 19. Пишем простой калькулятор
написал так
public class MainActivity extends Activity implements OnClickListener
//....
btnAdd.setOnClickListener(this);
результат тотже The application ..... has stopped unexpectedly. Please try again
public class MainActivity extends Activity implements OnClickListener
//....
btnAdd.setOnClickListener(this);
результат тотже The application ..... has stopped unexpectedly. Please try again
Re: Урок 19. Пишем простой калькулятор
ты на эмуле запускаешь или на железе?
у те6я лажа с подключением попро6уй перезагрузи все нафиг =)
если знаешь как пользовать adb kill-server то вперед, а еще Clean сделай
у те6я лажа с подключением попро6уй перезагрузи все нафиг =)
если знаешь как пользовать adb kill-server то вперед, а еще Clean сделай
CEO of a company R.id.team
Re: Урок 19. Пишем простой калькулятор
adb kill-server то вперед, а еще Clean сделай
а можно по подробнее что это?можно линки на уроки или примеры
а можно по подробнее что это?можно линки на уроки или примеры
Re: Урок 19. Пишем простой калькулятор
Подскажите а почему не сработал метод исключения, когда идет деление на ноль
Код: Выделить всё
case R.id.btnDiv:
oper = "/";
try {
result = num1 / num2;
}
catch (ArithmeticException e) {
tvResult.setText("division by zero");
}
Re: Урок 19. Пишем простой калькулятор
Как вариант может быть другое исключение, к примеру одна из переменных num1 или num2 не инициализированы, тогда будет исключение NullPointerException, поскольку вы его не обрабатываете, но оно появляется в блоке try, то вы его и не увидите.
Я обычно, если обрабатываю конкретное исключение, но есть вероятность возникновения других исключений, всегда добавляю еще один catch (Exception e){...}
к примеру:
Тогда, если выскочит еще какое исключение, помимо деления на ноль, то мы его увидим в LogCat;
ЗЫ Попробовал вызвать исключение делением на ноль, тоже не получилось, походу в JAVA допускается деление на ноль, выводил в лог результат получаем result = Infinity
А вот если использовать константы, к примеру, result = 5 / 0, то исключение генерируется.
Т.е. проверку деления на ноль, в данном случае можно делать так
Или, тупо, num2 проверять на 0
Я обычно, если обрабатываю конкретное исключение, но есть вероятность возникновения других исключений, всегда добавляю еще один 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");
}
Re: Урок 19. Пишем простой калькулятор
Исключение возникает при делении на целый ноль. При делении на (double)0 и (float)0 получается Infinity. Так же будет по умолчанию и в C++.
Re: Урок 19. Пишем простой калькулятор
Только деление целого на целый ноль дает исключение, все другие варианты дают infinity
Если infinity приводится к int то получаем 2147483648
В общем большой простор для скрытых багов.
Было дело, сталкивался с этим. Долго не мог найти ошибку в приложении (там было много сложных вычислений), при этом оно работало, но иногда результат получался неправильный. Только при тщательной трассировке я это infinity и увидел. Тогда просто исправил ошибку, но не стал особо заострять внимание, просто не было времени (много времени было убито на поиски этой ошибки). А вот если бы выпадало исключение, эту ошибку можно было найти за считанные минуты.
Ну да ладно, зато космические корабли и ракеты теперь не будут терять управление из-за деления на ноль
Если infinity приводится к int то получаем 2147483648
В общем большой простор для скрытых багов.
Было дело, сталкивался с этим. Долго не мог найти ошибку в приложении (там было много сложных вычислений), при этом оно работало, но иногда результат получался неправильный. Только при тщательной трассировке я это infinity и увидел. Тогда просто исправил ошибку, но не стал особо заострять внимание, просто не было времени (много времени было убито на поиски этой ошибки). А вот если бы выпадало исключение, эту ошибку можно было найти за считанные минуты.
Ну да ладно, зато космические корабли и ракеты теперь не будут терять управление из-за деления на ноль
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Урок 19. Пишем простой калькулятор
Скажешь это когда из за infinity один из них тебе в окошко залетитAndreyI писал(а):Ну да ладно, зато космические корабли и ракеты теперь не будут терять управление из-за деления на ноль
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
-
- Сообщения: 103
- Зарегистрирован: 10 сен 2012, 11:58
Re: Урок 19. Пишем простой калькулятор
Здравствуйте,
Как говорится, чем дальше в лес, тем больше дров. На основе уже узнанного, попытался сделать простейший калькулятор на свой лад (два поля ввода для циферок, одно для арифм. значений (+, -, *, / ) одно для =, и одно для результата) Вроде получается, но возникает одна проблема, не могу получить значение переменной 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;
}
}
}
Как говорится, чем дальше в лес, тем больше дров. На основе уже узнанного, попытался сделать простейший калькулятор на свой лад (два поля ввода для циферок, одно для арифм. значений (+, -, *, / ) одно для =, и одно для результата) Вроде получается, но возникает одна проблема, не могу получить значение переменной result из if при вызове case R.id.btnEq:(кнопка =)
Дает ноль, однако без if, значение отображается. Думаю, что т.к. переменная объявлена глобально, после того как num_a получила значение num, программа не может получить значение result и берет значение переменной объявленной по умолчанию (int result;), а это 0.
Просьба помочь,заодно прояснив вопрос, почему в switch оператор if ведет себя подобным образом.
В case R.id.btn_1:, он ведь возвращает значение num.
Код: Выделить всё
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;
}
}
}
-
- Сообщения: 103
- Зарегистрирован: 10 сен 2012, 11:58
Re: Урок 19. Пишем простой калькулятор
Код: Выделить всё
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;
}
}
}
Re: Урок 19. Пишем простой калькулятор
А зачем нужен этот if?
Я чет даже и не знаю, что такое isActivated ... Фокус чтоль?
Я чет даже и не знаю, что такое isActivated ... Фокус чтоль?