Страница 2 из 14

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

Добавлено: 29 июл 2012, 18:26
Eshkin-Kat
Изображение
прописал вручную импорт import android.view.OnClickListener; но оно его не понимает и предлагает удалить как неиспользуемый.

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

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

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

Добавлено: 29 июл 2012, 19:54
Eshkin-Kat
Изображение
я об этом. здесь предлагает удалить неиспольщуемый

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

Добавлено: 29 июл 2012, 19:55
Eshkin-Kat
так что мне делать то?

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

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

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

Добавлено: 29 июл 2012, 23:45
Rapiro
у меня была такаяже ошибка
вылечилось так
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. Пишем простой калькулятор

Добавлено: 29 июл 2012, 23:57
Finch

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

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

btnAdd.setOnClickListener(this);

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

Добавлено: 30 июл 2012, 00:06
Rapiro
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)

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

Добавлено: 30 июл 2012, 00:15
math64
Когда ты пишешь так:

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

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

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

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

А без setOnClickListener() валится? мне кажется ошибка где-то в другом месте.

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

Добавлено: 30 июл 2012, 00:19
Rapiro
написал так
public class MainActivity extends Activity implements OnClickListener

//....

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

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

Добавлено: 30 июл 2012, 00:34
Finch
ты на эмуле запускаешь или на железе?
у те6я лажа с подключением попро6уй перезагрузи все нафиг =)
если знаешь как пользовать adb kill-server то вперед, а еще Clean сделай

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

Добавлено: 30 июл 2012, 08:49
Rapiro
adb kill-server то вперед, а еще Clean сделай
а можно по подробнее что это?можно линки на уроки или примеры

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

Добавлено: 05 сен 2012, 21:18
Roman
Подскажите а почему не сработал метод исключения, когда идет деление на ноль

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

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

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

Добавлено: 06 сен 2012, 00:24
AndreyI
Как вариант может быть другое исключение, к примеру одна из переменных 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

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

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

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

Добавлено: 06 сен 2012, 10:07
AndreyI
Только деление целого на целый ноль дает исключение, все другие варианты дают infinity
Если infinity приводится к int то получаем 2147483648

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

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

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

Добавлено: 06 сен 2012, 10:43
KamiSempai
AndreyI писал(а):Ну да ладно, зато космические корабли и ракеты теперь не будут терять управление из-за деления на ноль :)
Скажешь это когда из за infinity один из них тебе в окошко залетит :)

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

Добавлено: 17 сен 2012, 14:15
dil_android
Здравствуйте,

Как говорится, чем дальше в лес, тем больше дров. На основе уже узнанного, попытался сделать простейший калькулятор на свой лад (два поля ввода для циферок, одно для арифм. значений (+, -, *, / ) одно для =, и одно для результата) Вроде получается, но возникает одна проблема, не могу получить значение переменной 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;
}
}
}

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

Добавлено: 17 сен 2012, 14:18
dil_android

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

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. Пишем простой калькулятор

Добавлено: 19 сен 2012, 17:06
damager82
А зачем нужен этот if?
Я чет даже и не знаю, что такое isActivated ... Фокус чтоль?