Страница 3 из 14
Re: Урок 19. Пишем простой калькулятор
Добавлено: 19 сен 2012, 20:07
dil_android
Идея такая, что при нажатии = осуществляется проверка. Если ранее нажимался +, то:
if (button_Add.isActivated()) {
result = num_a + num;
}
если -
if (button_Sub.isActivated()) {
result = num_a - num;
}
соответственно * и /
насколько я понял isActivated наподобие isEnabled, т.е. была нажата.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 19 сен 2012, 20:12
dil_android
Понимаю, что путаюсь в логической последовательности действий, но не могу понять где ошибка.
И опять таки, почему if срабатывает в case R.id.btn_1, case R.id.btn_2 и во всех оcтальных, но не хочет в case R.id.btnEq ?
Re: Урок 19. Пишем простой калькулятор
Добавлено: 19 сен 2012, 23:55
rezak90
dil_android хотелось бы помочь, но код жутко не читабелен. Поработайте над правописанием (не русского языка) кода. Та и сама логика приложение не понятна и странная - посмотрел первые строки и я так понял у вас три поля ввода (два поля для ввода чисел и один для операторов), такое в голове не укладывается, что пользователь ещё должен вводить даже тот же оператор. В Андроиде есть стандартный калькулятор, посмотрите как он выглядит и сделайте по аналогии, если получится то добавляйте уже свои функции.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 20 сен 2012, 04:28
dil_android
Да, извините. Выкладывал после того, как уже совсем ничего не понимал.
Создал пять полей ввода:
два для чисел etNum_1 и etNum_2
одно для операторов (+, -, *, /) et_sign
одно для оператора (=) et_equals
и одно для отображения результата etNum_3
Идея, превратить в дальнейшем этот калькулятор в детский, оперирующий только целыми числами и в пределах одного знака (для этого в <EditText> используется android:maxLength="1"). Так как в дальнейшем хочу анимировать цифры и операторы, подумал, что имея отдельные view компоненты, как например <EditText>, далее можно будет проще и легче обращаться с ними при программировании анимации.
Понимаю,что вопрос не в рамках Урока, но хотелось бы довести до конца то, над чем сидел выходные.
Заранее спасибо.
Здесь полный код:
Код: Выделить всё
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.btnSub:
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.btnMult:
et_sign.setText("*");
if (etNum_1.isFocused()) {
etNum_1.clearFocus();
etNum_2.isFocusable();
etNum_2.requestFocus();
} else {
etNum_2.isFocused();
etNum_2.clearFocus();
}
break;
case R.id.btnDiv:
et_sign.setText("/");
if (etNum_1.isFocused()) {
etNum_1.clearFocus();
etNum_2.isFocusable();
etNum_2.requestFocus();
} else {
etNum_2.isFocused();
etNum_2.clearFocus();
}
break;
case R.id.btnEq: // при нажатии кнопки = осуществляется проверка нажимались ли (+,-,*,/)
et_equals.setText("=");
[b]
// здесь, выставляя if { button_Add.(булен проверка если кнопку плюс нажимали)
// result = num_a + num;
// button_Sub.(булен проверка если кнопка минус нажимали)
// result = num_a - num;
//должно получаться значение result и передаваться в etNum_3.setText(Integer.toString(result));
//без if, результат передается, но только для одного действия, так как, очевидно, что если я укажу просто
// result = num_a + num;
// result = num_a - num;
// result = num_a * num;
// result = num_a / num; и буду затем передавать в etNum_3 программа будет ругаться
[/b]
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;
case R.id.btn_3:
break;
case R.id.btn_4:
break;
case R.id.btn_5:
break;
case R.id.btn_6:
break;
case R.id.btn_7:
break;
case R.id.btn_8:
break;
case R.id.btn_9:
break;
case R.id.btn_0:
break;
}
}
}
Опять таки, наверняка путаюсь в логической последовательности действий, но не пойму где.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 20 сен 2012, 10:07
rezak90
1) про красоту кода я уже говорил, повторятся не буду;
2) повторения кода на каждой кнопке, не ужели нельзя вынести вот этот блок:
Код: Выделить всё
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.btnSub:
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.btnMult:
et_sign.setText("*");
if (etNum_1.isFocused()) {
etNum_1.clearFocus();
etNum_2.isFocusable();
etNum_2.requestFocus();
} else {
etNum_2.isFocused();
etNum_2.clearFocus();
}
break;
case R.id.btnDiv:
et_sign.setText("/");
if (etNum_1.isFocused()) {
etNum_1.clearFocus();
etNum_2.isFocusable();
etNum_2.requestFocus();
} else {
etNum_2.isFocused();
etNum_2.clearFocus();
}
break;
у вас один и тот же код повторяется 4 раза
3)
в чём смысл этих строк:
Код: Выделить всё
if (etNum_1.isFocused()) {
etNum_1.clearFocus();
etNum_2.isFocusable(); // вот эта
etNum_2.requestFocus();
} else {
etNum_2.isFocused(); // и вот эта
etNum_2.clearFocus();
}
они делают проверку и возвращают иситну или ложь, what for?
4) я так и не понял зачем использовать поля ввода, если можно минимизировать всё повесив кнопки, при этом количество кода уменьшится и вероятность ввода человеком нежелательных значений отпадает;
5) не вижу не одной проверки на введённые данные. Если пользователь введёт не число а "йцпупйцуйцун" ? будет фейл
Что бы с этим не заморачиваться смотрите выше;
P.S. Мой вывод - это велосипед индусского производства
P.P.S Надеюсь к критике вы отнесётесь разумно.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 20 сен 2012, 11:23
dil_android
Спасибо за ответ. Сам понимаю, что код написан коряво, но на то есть свои причины:
1.Как уже писал ранее, не силен в программировании, но очень хочется восстановить знания полученные когда-то, и заодно научиться делать это, по крайней мере хорошо, в Android.
2. (ссылка на пункт 1.) Прежде чем оптимизировать код, хочу убедиться в том, что логическая последовательность действий правильна и весь этот велосипед сможет ехать.
Теперь по вашим замечаниям:
5. проверки еще не писал, но о них думал (например, деление на ноль). Что писать (наверняка деление на ноль, accidental input, что еще?) буду решать после.
4. объясните пожалуйста, что означает "минимизировать все повесив кнопки". Кнопки описаны в main и вызывают метод onButtonClick(View view) строкой <android:onClick="onButtonClick">;
3.смысл строки в следующем. Как только открывается приложение, поле ввода etNum_1 автоматом находится в фокусе. После того как вводится числовое значение в etNum_1 и нажимается (+, -, *, /) происходит проверка
Код: Выделить всё
if (etNum_1.isFocused()) {
etNum_1.clearFocus();
etNum_2.isFocusable();
etNum_2.requestFocus();
} else {
etNum_2.isFocused();
etNum_2.clearFocus();
}
по результату которой фокус передается etNum_2 для ввода второго числового значения (else если etNum_2 уже в фокусе).
Когда вы нажимаете =, то фокус передается от etNum_2 к etNum_3 для отображения результата.
Вот тут меня начинает клинить, и возникает вопрос: почему не срабатывает if. может я проверочный метод не тот вызываю button_Add.isEnabled(да,кнопка плюс нажималась, первое значение num,полученное из etNum_1 передано в num_a и теперь, после того как num принял значение из etNum_2 можно осуществлять сложение и получать результат result = num_a+num).
2. и 1. как вынести блок пока не думал, но опять таки (ссылка на мои пункт 1 и 2). Если вас не затруднит, дайте пожалуйста какой нибудь clue, как можно это аккуратно сделать.
Еще раз приношу извинения за то, что обсуждаемый вопрос не совсем по уроку.
Спасибо.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 20 сен 2012, 11:31
rezak90
Вот тут меня начинает клинить, и возникает вопрос: почему не срабатывает if
потому что по нажатию на кнопку фокус передаётся ей и по этому isFocused() будет возвращать false
Re: Урок 19. Пишем простой калькулятор
Добавлено: 20 сен 2012, 11:49
dil_android
т.е., вопрос в согласованности времен?
нажав кнопку = я не могу спросить нажималась ли до этого кнопка + ???
Re: Урок 19. Пишем простой калькулятор
Добавлено: 20 сен 2012, 11:55
dil_android
что в этом случае делать?
как проверить была ли нажата btn_Add?
Re: Урок 19. Пишем простой калькулятор
Добавлено: 20 сен 2012, 11:57
math64
1. Заменить везде EditText на TextView. - добавив соответствующий стиль оформления
2. Вместо isFocused(), requestFocus(), clearFocus() использовать переменную класса boolean firstOperand; и/или boolean secondOperand;
3. Для проверки что нажималаь кнопка операции - переменная класса char operation;
Re: Урок 19. Пишем простой калькулятор
Добавлено: 21 сен 2012, 04:40
dil_android
Спасибо большое math64,
После того, как вы дали направление, получилось следующее:
Код: Выделить всё
public class MainActivity extends Activity {
int num_1 = 0;
int num_2 = 0;
int result = 0;
boolean operand;
boolean firstTextField_isFull;
String textValue = "";
TextView etNum_1; // объявляю поле ввода первого значения
TextView et_sign; // поле ввода знака (+,-,*,/)
TextView etNum_2; // поле ввода второго значения
TextView et_equals; //поле ввода знака равно (=)
TextView etNum_3; //поле результата
ImageButton button_Add;
ImageButton button_Sub;
ImageButton button_Mult;
ImageButton button_Div;
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
etNum_1 = (TextView) findViewById(R.id.etNum_1);
et_sign = (TextView) findViewById(R.id.et_sign);
etNum_2 = (TextView) findViewById(R.id.etNum_2);
et_equals = (TextView) findViewById(R.id.et_equals);
etNum_3 = (TextView) findViewById(R.id.etNum_3);
button_Add = (ImageButton) findViewById(R.id.btnAdd); // кнопка сложения
button_Sub = (ImageButton) findViewById(R.id.btnSub); // кнопка вычитания
button_Mult = (ImageButton) findViewById(R.id.btnMult);
button_Div = (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("+");
firstTextField_isFull = true;
operand = true;
break;
case R.id.btnSub:
et_sign.setText("-");
firstTextField_isFull = true;
operand = false;
break;
case R.id.btnMult:
et_sign.setText("*");
firstTextField_isFull = true;
operand = true;
break;
case R.id.btnDiv:
et_sign.setText("/");
firstTextField_isFull = true;
operand = false;
break;
case R.id.btnEq:
et_equals.setText("=");
if (operand == true) {
result = num_1 + num_2;
} else {
result = num_1 - num_2;
}
if (operand == true) {
result = num_1 * num_2;
} else {
result = num_1 / num_2;
}
etNum_3.setText(Integer.toString(result));
firstTextField_isFull = false;
break;
case R.id.btn_1:
textValue = "";
if (firstTextField_isFull == false) {
etNum_1.setText(textValue + "1");
textValue = etNum_1.getText().toString();
num_1 = Integer.parseInt(textValue);
} else {
etNum_2.setText(textValue + "1");
textValue = etNum_2.getText().toString();
num_2 = Integer.parseInt(textValue);
}
break;
case R.id.btn_2:
textValue = "";
if (firstTextField_isFull == false) {
etNum_1.setText(textValue + "2");
textValue = etNum_1.getText().toString();
num_1 = Integer.parseInt(textValue);
} else {
etNum_2.setText(textValue + "2");
textValue = etNum_2.getText().toString();
num_2 = Integer.parseInt(textValue);
}
break;
case R.id.btn_3:
textValue = "";
if (firstTextField_isFull == false) {
etNum_1.setText(textValue + "3");
textValue = etNum_1.getText().toString();
num_1 = Integer.parseInt(textValue);
} else {
etNum_2.setText(textValue + "3");
textValue = etNum_2.getText().toString();
num_2 = Integer.parseInt(textValue);
}
break;
case R.id.btn_4:
textValue = "";
if (firstTextField_isFull == false) {
etNum_1.setText(textValue + "4");
textValue = etNum_1.getText().toString();
num_1 = Integer.parseInt(textValue);
} else {
etNum_2.setText(textValue + "4");
textValue = etNum_2.getText().toString();
num_2 = Integer.parseInt(textValue);
}
break;
}
}
}
намного, намного красивше и мне кажется более читабельно чем было. Главное, я избавился от focus.
однако программа, при вызове, упорно пытается убедить меня, что 1+1=1, а 1+2=2, такая же ситуация с вычитанием.
Умножение и деление проходят нормально.
Подскажите, где я допускаю ошибку.
P.S.Что касается проверок, то единственные, которые нужно будет писать, это деление на ноль и отрицательное значение при вычитании. Вводить буквенные или другие значения не получится, так как в </TextView> для операндов есть android:digits="+-*/", а для числовых значений android:inputType="number"
Re: Урок 19. Пишем простой калькулятор
Добавлено: 21 сен 2012, 09:13
math64
Потому, что переменная operand должна быть типа char и принимать значения '+', '-', '*', '/' и 0 (не выбрано) (PS: в Unicode есть символы '×' и '÷' - можешь использовать их)
У тебя она типа boolean и не может отличить + от * и после сложения делает умножение, которое затирает результат сложения.
Обработчики для R.id.btn_0, R.id.btn_1 ... R.id.btn_9 можешь объединить прописав в разметке в tag для этих кнопок "0", "1" ... "9".
Re: Урок 19. Пишем простой калькулятор
Добавлено: 21 сен 2012, 09:43
rezak90
а калькулятор только целые числа считает? вещественные не нужно?! и результаты в целые))) 5/2=2 хД)
Re: Урок 19. Пишем простой калькулятор
Добавлено: 21 сен 2012, 14:51
dil_android
Как говорил один мой знакомый: "Я не тупой, а просто малознающий". Начну со слов благодарности math64 и rezak90. Особенно помогли последние комменты от math64. Без вашей помощи я не смог бы написать, по настоящему свою, первую программу в Android. Теперь по делу:
1. написал следующие проверки
Код: Выделить всё
case R.id.btnEq:
et_equals.setText("=");
if (calc == '+') {
result = num_1 + num_2;
} else {
if (calc == '-') {
if (num_2 > num_1) {
Toast.makeText(this, "Мы этого еще не проходили", 1000).show();
et_sign.setText("");
et_equals.setText("");
etNum_3.setText("");
etNum_2.setText("");
etNum_1.setText("");
firstTextField_isFull = false;
return;
} else {
result = num_1 - num_2;
}
}
}
if (calc == '*') {
result = num_1 * num_2;
} else {
if (calc == '/') {
if (num_1 < num_2 || num_2 == 0) {
Toast.makeText(this, "Мы этого еще не проходили", 1000).show();
et_sign.setText("");
et_equals.setText("");
etNum_3.setText("");
etNum_2.setText("");
etNum_1.setText("");
firstTextField_isFull = false;
return;
} else {
result = num_1 / num_2;
}
}
}
etNum_3.setText(Integer.toString(result));
firstTextField_isFull = false;
break;
и читая последний коммент от rezak90 понял, что упустил еще одну, а именно деление, при котором получается не целочисленное значение (например 9/2). Сразу вопрос: есть ли какой нибудь метод, проверяющий, если число на выходе не int a float или double например?
2. Надо будет оптимизировать код на защиту от дурака, а именно повторные нажатия кнопок операндов и т.д. Особенно актуально если из этой заготовки действительно получится хороший, детский, анимированный калькулятор.
Надо еще добавить кнопку ClearAll, чтобы очищать все поля и т.д.
Вообщем, буду доводить, одновременно с изучением Уроков.
Еще раз спасибо всем, тему "как я клепал калькулятор" позвольте считать закрытой.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 21 сен 2012, 15:23
rezak90
Проверок как таковых нету. Можно првоерять на остаток, если остаток не равен нулю то результат вещественный. Но это велосипед.
Я когда писал свой первый калькулятор то реализовывал всё через класс Math - специальный класс для математических вычислений в Java. Он может всё =) И у него погрешность очень маленькая или вообще нету. Я где то читал что оракл рекомендуют использовать его для финансовых вычислений, потому как у него точность составляет 100000 знаков после запятой.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 27 окт 2012, 15:02
Sevak
Здравствуйте! Недавно понадобилось написать программу для подсчета определителя, дабы облегчить себе жизнь на уроках! Сказано - сделано! Вот приложение, но с одним маленьким косяком, о котором после кода:
Код: Выделить всё
package com.example.determinant;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Determinant extends Activity implements OnClickListener {
EditText x1_s, x2_s, x3_s;
EditText y1_s, y2_s, y3_s;
EditText z1_s, z2_s, z3_s;
int x1, x2, x3;
int y1, y2, y3;
int z1, z2, z3;
int otvet;
String otvet_s;
Button btnResult;
Button clear;
TextView otvet_text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
x1_s = (EditText) findViewById(R.id.x1);
x2_s = (EditText) findViewById(R.id.x2);
x3_s = (EditText) findViewById(R.id.x3);
y1_s = (EditText) findViewById(R.id.y1);
y2_s = (EditText) findViewById(R.id.y2);
y3_s = (EditText) findViewById(R.id.y3);
z1_s = (EditText) findViewById(R.id.z1);
z2_s = (EditText) findViewById(R.id.z2);
z3_s = (EditText) findViewById(R.id.z3);
btnResult = (Button) findViewById(R.id.btnResult);
clear = (Button) findViewById(R.id.clear);
otvet_text = (TextView) findViewById(R.id.otvet);
clear.setOnClickListener(this);
btnResult.setOnClickListener(this);
}
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId())
{
case R.id.clear:
x1_s.setText("");
x2_s.setText("");
x3_s.setText("");
y1_s.setText("");
y2_s.setText("");
y3_s.setText("");
z1_s.setText("");
z2_s.setText("");
z3_s.setText("");
otvet_text.setText("");
break;
case R.id.btnResult:
x1 = Integer.parseInt(x1_s.getText().toString());
x2 = Integer.parseInt(x2_s.getText().toString());
x3 = Integer.parseInt(x3_s.getText().toString());
y1 = Integer.parseInt(y1_s.getText().toString());
y2 = Integer.parseInt(y2_s.getText().toString());
y3 = Integer.parseInt(y3_s.getText().toString());
z1 = Integer.parseInt(z1_s.getText().toString());
z2 = Integer.parseInt(z2_s.getText().toString());
z3 = Integer.parseInt(z3_s.getText().toString());
otvet = x1*y2*z3 + x2*y3*z1 + x3*z2*y1 - x3*y2*z1 - x2*y1*z3 - x1*z2*y3;
otvet_s = Integer.toString(otvet);
otvet_text.setText(otvet_s);
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Код: Выделить всё
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/x1"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="10dp"
android:layout_marginTop="15dp"
android:ems="10"
android:hint="x1"
android:inputType="numberSigned"
android:maxLength="6" />
<EditText
android:id="@+id/y1"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/x1"
android:layout_alignBottom="@+id/x1"
android:layout_centerHorizontal="true"
android:ems="10"
android:hint="y1"
android:inputType="numberSigned"
android:maxLength="6" />
<EditText
android:id="@+id/z1"
android:layout_width="80dp"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/y1"
android:layout_alignBottom="@+id/y1"
android:layout_alignParentRight="true"
android:layout_marginRight="14dp"
android:ems="10"
android:hint="z1"
android:inputType="numberSigned"
android:maxLength="6" />
<EditText
android:id="@+id/x2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/x1"
android:layout_alignRight="@+id/x1"
android:layout_below="@+id/x1"
android:layout_marginTop="31dp"
android:ems="10"
android:hint="x2"
android:inputType="numberSigned"
android:maxLength="6" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/y2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/x2"
android:layout_alignBottom="@+id/x2"
android:layout_alignLeft="@+id/y1"
android:layout_alignRight="@+id/y1"
android:ems="10"
android:hint="y2"
android:inputType="numberSigned"
android:maxLength="6" />
<EditText
android:id="@+id/z2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/y2"
android:layout_alignBottom="@+id/y2"
android:layout_alignLeft="@+id/z1"
android:layout_alignRight="@+id/z1"
android:ems="10"
android:hint="z2"
android:inputType="numberSigned"
android:maxLength="6" />
<EditText
android:id="@+id/x3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/x2"
android:layout_alignRight="@+id/x2"
android:layout_below="@+id/x2"
android:layout_marginTop="34dp"
android:ems="10"
android:hint="x3"
android:inputType="numberSigned"
android:maxLength="6" />
<EditText
android:id="@+id/y3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/x3"
android:layout_alignBottom="@+id/x3"
android:layout_alignLeft="@+id/y2"
android:layout_alignRight="@+id/y2"
android:ems="10"
android:hint="y3"
android:inputType="numberSigned"
android:maxLength="6" />
<EditText
android:id="@+id/z3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/y3"
android:layout_alignBottom="@+id/y3"
android:layout_alignLeft="@+id/z2"
android:layout_alignRight="@+id/z2"
android:ems="10"
android:hint="z3"
android:inputType="numberSigned"
android:maxLength="6" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginBottom="51dp"
android:layout_marginLeft="16dp"
android:text="Определитель: "
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/otvet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/textView1"
android:layout_alignRight="@+id/z3"
android:layout_alignTop="@+id/textView1"
android:layout_toRightOf="@+id/textView1"
android:textAppearance="?android:attr/textAppearanceLarge" />
<Button
android:id="@+id/btnResult"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/x3"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="38dp"
android:text="СЧИТАЙ ОПРЕДЕЛИТЕЛЬ!" />
<Button
android:id="@+id/clear"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/btnResult"
android:layout_alignRight="@+id/btnResult"
android:layout_below="@+id/btnResult"
android:text="ОЧИСТЬ ВСЕ!" />
</RelativeLayout>
</LinearLayout>
Так вот: если не заполнить поля и нажать на кнопку подсчета, то программа крашится, т.к. в ней нет значений! Я хочу сделать эту кнопку неактивной, т.е.
, но как прикрутить к этому
Код: Выделить всё
if (TextUtils.isEmpty(etNum1.getText().toString())
|| TextUtils.isEmpty(etNum2.getText().toString())) {
return;
}
В правильном ли я направлении думаю и не слишком громоздко ли получится?
Re: Урок 19. Пишем простой калькулятор
Добавлено: 29 окт 2012, 10:45
damager82
Sevak писал(а):Я хочу сделать эту кнопку неактивной
Немного другой, но самый простой вариант - обернуть все операции, которые выполняются по нажатию кнопки R.id.btnResult, в try catch и ловить в нем java.lang.NumberFormatException. Если поймали, то выводить сообщение, что данные введены неверно. Прога рушиться не будет.
А если нужна именно неактивная кнопка, то создавайте
TextWatcher один на всех, и в нем в методе onTextChanged прогоняйте все нужные EditText и проверяйте на непустоту. Для удобства все EditText можно запихать в массив и работать уже с ним.
Re: Урок 19. Пишем простой калькулятор
Добавлено: 30 окт 2012, 12:29
Sevak
damager82 писал(а):Sevak писал(а):Я хочу сделать эту кнопку неактивной
Немного другой, но самый простой вариант - обернуть все операции, которые выполняются по нажатию кнопки R.id.btnResult, в try catch и ловить в нем java.lang.NumberFormatException. Если поймали, то выводить сообщение, что данные введены неверно. Прога рушиться не будет.
А если нужна именно неактивная кнопка, то создавайте
TextWatcher один на всех, и в нем в методе onTextChanged прогоняйте все нужные EditText и проверяйте на непустоту. Для удобства все EditText можно запихать в массив и работать уже с ним.
спасибо большое, воспользовался первым способом, теперь все работает) только там был NumberFormatException
Re: Урок 19. Пишем простой калькулятор
Добавлено: 03 ноя 2012, 17:13
Natalia
Эмулятор останавливает приложение после нажатия на равно, в чем ошибка?
package com.windows.seven.calculator;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.text.method.DigitsKeyListener;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
EditText edText;
TextView btnAdd;
TextView btnSub;
TextView btnMult;
TextView btnDiv;
TextView btnRez;
TextView btnCom;
TextView btnClear;
TextView btn0;
TextView btn1;
TextView btn2;
TextView btn3;
TextView btn4;
TextView btn5;
TextView btn6;
TextView btn7;
TextView btn8;
TextView btn9;
//Результат который заносится в масив для обработки
ArrayList<Float> result = new ArrayList<Float>();
//Первое введенное число
float num1;
//Второе введенное число
float num2;
int currentOperation = 0;
int nextOperation;
//Прибавление
final static int ADD = 1;
//Вычитание
final static int SUB = 2;
//Умножение
final static int MULT = 3;
//Деление
final static int DIV = 4;
//Равно
final static int REZ = 5;
final static int CLEAR = 1;
final static int DONT_CLEAR = 0;
int clearCalcDisplay = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//находим элементы
edText = (EditText) findViewById(R.id.edText);
btnRez = (TextView) findViewById(R.id.btnRez);
btnAdd = (TextView) findViewById(R.id.btnAdd);
btnSub = (TextView) findViewById(R.id.btnSub);
btnMult = (TextView) findViewById(R.id.btnMult);
btnDiv = (TextView) findViewById(R.id.btnDiv);
btnCom = (TextView) findViewById(R.id.btnCom);
btnClear = (TextView) findViewById(R.id.btnClear);
btn0=(TextView) findViewById(R.id.btn0);
btn1=(TextView) findViewById(R.id.btn1);
btn2=(TextView) findViewById(R.id.btn2);
btn3=(TextView) findViewById(R.id.btn3);
btn4=(TextView) findViewById(R.id.btn4);
btn5=(TextView) findViewById(R.id.btn5);
btn6=(TextView) findViewById(R.id.btn6);
btn7=(TextView) findViewById(R.id.btn7);
btn8=(TextView) findViewById(R.id.btn8);
btn9=(TextView) findViewById(R.id.btn9);
edText.setKeyListener(DigitsKeyListener.getInstance(true,true));
registerListeners();
}
//Обработка нажатия на экран
public void registerListeners () {
btn0.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("0");
}
});
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("1");
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("2");
}
});
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("3");
}
});
btn4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("4");
}
});
btn5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("5");
}
});
btn6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("6");
}
});
btn7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("7");
}
});
btn8.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("8");
}
});
btn9.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
edText.setText("");
}
clearCalcDisplay = DONT_CLEAR;
edText.append("9");
}
});
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(ADD);
}
});
btnSub.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(SUB);
}
});
btnMult.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(MULT);
}
});
btnDiv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(DIV);
}
});
btnRez.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(REZ);
}
});
btnClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
edText.setText("");
num1 = 0;
num2 = 0;
result.removeAll(result);
currentOperation = 0;
nextOperation = 0;
}
});
}
//функция расчета введенных значений
private void calcLogic(int operator) {
result.add(Float.parseFloat(edText.getText().toString()));
if (operator !=REZ) {
nextOperation = operator;
} else if (operator == REZ) {
nextOperation = 0;
}
switch (currentOperation) {
//Прибавление
case ADD:
num1 = result.get(0);
num2 = result.get(1);
result.removeAll(result);
result.add(num1 + num2);
edText.setText(String.format("%.Of", result.get(0)));
break;
case SUB:
num1 = result.get(0);
num2 = result.get(1);
result.removeAll(result);
result.add(num1 - num2);
edText.setText(String.format("%.Of", result.get(0)));
break;
case MULT:
num1 = result.get(0);
num2 = result.get(1);
result.removeAll(result);
result.add(num1 * num2);
edText.setText(String.format("%.Of", result.get(0)));
break;
case DIV:
num1 = result.get(0);
num2 = result.get(1);
result.removeAll(result);
result.add(num1 / num2);
edText.setText(String.format("%.Of", result.get(0)));
break;
}
clearCalcDisplay = CLEAR;
currentOperation = nextOperation;
if (operator == REZ) {
num1 = 0;
num2 = 0;
result.removeAll(result);
}
}
}
Re: Урок 19. Пишем простой калькулятор
Добавлено: 03 ноя 2012, 17:55
rezak90
Эмулятор останавливает приложение после нажатия на равно, в чем ошибка?
Если бы вы предоставили код ошибки то можно было бы сразу решить проблему. А так могу лишь предположить что происходит NullPointerException или же NumberFormatException, так как при парсинге вы не обрабатываете их.