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

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

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

Сообщение dil_android » 19 сен 2012, 20:07

Идея такая, что при нажатии = осуществляется проверка. Если ранее нажимался +, то:

if (button_Add.isActivated()) {
result = num_a + num;
}

если -

if (button_Sub.isActivated()) {
result = num_a - num;
}

соответственно * и /

насколько я понял isActivated наподобие isEnabled, т.е. была нажата.

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

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

Сообщение dil_android » 19 сен 2012, 20:12

Понимаю, что путаюсь в логической последовательности действий, но не могу понять где ошибка.
И опять таки, почему if срабатывает в case R.id.btn_1, case R.id.btn_2 и во всех оcтальных, но не хочет в case R.id.btnEq ?

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

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

Сообщение rezak90 » 19 сен 2012, 23:55

dil_android хотелось бы помочь, но код жутко не читабелен. Поработайте над правописанием (не русского языка) кода. Та и сама логика приложение не понятна и странная - посмотрел первые строки и я так понял у вас три поля ввода (два поля для ввода чисел и один для операторов), такое в голове не укладывается, что пользователь ещё должен вводить даже тот же оператор. В Андроиде есть стандартный калькулятор, посмотрите как он выглядит и сделайте по аналогии, если получится то добавляйте уже свои функции.
R.id.team
Политика на форуме запрещена

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

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

Сообщение dil_android » 20 сен 2012, 04:28

Да, извините. Выкладывал после того, как уже совсем ничего не понимал.
Создал пять полей ввода:
два для чисел 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;
        }
    }
}

Опять таки, наверняка путаюсь в логической последовательности действий, но не пойму где.

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

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

Сообщение rezak90 » 20 сен 2012, 10:07

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 раза :shock:

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 Надеюсь к критике вы отнесётесь разумно.
R.id.team
Политика на форуме запрещена

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

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

Сообщение dil_android » 20 сен 2012, 11:23

Спасибо за ответ. Сам понимаю, что код написан коряво, но на то есть свои причины:

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, как можно это аккуратно сделать.

Еще раз приношу извинения за то, что обсуждаемый вопрос не совсем по уроку.

Спасибо.

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

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

Сообщение rezak90 » 20 сен 2012, 11:31

Вот тут меня начинает клинить, и возникает вопрос: почему не срабатывает if
потому что по нажатию на кнопку фокус передаётся ей и по этому isFocused() будет возвращать false
R.id.team
Политика на форуме запрещена

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

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

Сообщение dil_android » 20 сен 2012, 11:49

т.е., вопрос в согласованности времен?
нажав кнопку = я не могу спросить нажималась ли до этого кнопка + ???

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

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

Сообщение dil_android » 20 сен 2012, 11:55

что в этом случае делать?
как проверить была ли нажата btn_Add?

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

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

Сообщение math64 » 20 сен 2012, 11:57

1. Заменить везде EditText на TextView. - добавив соответствующий стиль оформления
2. Вместо isFocused(), requestFocus(), clearFocus() использовать переменную класса boolean firstOperand; и/или boolean secondOperand;
3. Для проверки что нажималаь кнопка операции - переменная класса char operation;

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

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

Сообщение dil_android » 21 сен 2012, 04:40

Спасибо большое 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"

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

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

Сообщение math64 » 21 сен 2012, 09:13

Потому, что переменная operand должна быть типа char и принимать значения '+', '-', '*', '/' и 0 (не выбрано) (PS: в Unicode есть символы '×' и '÷' - можешь использовать их)
У тебя она типа boolean и не может отличить + от * и после сложения делает умножение, которое затирает результат сложения.

Обработчики для R.id.btn_0, R.id.btn_1 ... R.id.btn_9 можешь объединить прописав в разметке в tag для этих кнопок "0", "1" ... "9".

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

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

Сообщение rezak90 » 21 сен 2012, 09:43

а калькулятор только целые числа считает? вещественные не нужно?! и результаты в целые))) 5/2=2 хД)
R.id.team
Политика на форуме запрещена

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

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

Сообщение dil_android » 21 сен 2012, 14:51

Как говорил один мой знакомый: "Я не тупой, а просто малознающий". Начну со слов благодарности 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, чтобы очищать все поля и т.д.

Вообщем, буду доводить, одновременно с изучением Уроков.

Еще раз спасибо всем, тему "как я клепал калькулятор" позвольте считать закрытой.

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

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

Сообщение rezak90 » 21 сен 2012, 15:23

Проверок как таковых нету. Можно првоерять на остаток, если остаток не равен нулю то результат вещественный. Но это велосипед.
Я когда писал свой первый калькулятор то реализовывал всё через класс Math - специальный класс для математических вычислений в Java. Он может всё =) И у него погрешность очень маленькая или вообще нету. Я где то читал что оракл рекомендуют использовать его для финансовых вычислений, потому как у него точность составляет 100000 знаков после запятой.
R.id.team
Политика на форуме запрещена

Sevak
Сообщения: 6
Зарегистрирован: 08 авг 2012, 14:41

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

Сообщение Sevak » 27 окт 2012, 15:02

Здравствуйте! Недавно понадобилось написать программу для подсчета определителя, дабы облегчить себе жизнь на уроках! Сказано - сделано! Вот приложение, но с одним маленьким косяком, о котором после кода:

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

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>

Так вот: если не заполнить поля и нажать на кнопку подсчета, то программа крашится, т.к. в ней нет значений! Я хочу сделать эту кнопку неактивной, т.е.

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

btnResult.setEnable(false);
, но как прикрутить к этому

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

if (TextUtils.isEmpty(etNum1.getText().toString())
        || TextUtils.isEmpty(etNum2.getText().toString())) {
      return;
    }
В правильном ли я направлении думаю и не слишком громоздко ли получится?

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

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

Сообщение damager82 » 29 окт 2012, 10:45

Sevak писал(а):Я хочу сделать эту кнопку неактивной
Немного другой, но самый простой вариант - обернуть все операции, которые выполняются по нажатию кнопки R.id.btnResult, в try catch и ловить в нем java.lang.NumberFormatException. Если поймали, то выводить сообщение, что данные введены неверно. Прога рушиться не будет.

А если нужна именно неактивная кнопка, то создавайте TextWatcher один на всех, и в нем в методе onTextChanged прогоняйте все нужные EditText и проверяйте на непустоту. Для удобства все EditText можно запихать в массив и работать уже с ним.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Sevak
Сообщения: 6
Зарегистрирован: 08 авг 2012, 14:41

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

Сообщение Sevak » 30 окт 2012, 12:29

damager82 писал(а):
Sevak писал(а):Я хочу сделать эту кнопку неактивной
Немного другой, но самый простой вариант - обернуть все операции, которые выполняются по нажатию кнопки R.id.btnResult, в try catch и ловить в нем java.lang.NumberFormatException. Если поймали, то выводить сообщение, что данные введены неверно. Прога рушиться не будет.

А если нужна именно неактивная кнопка, то создавайте TextWatcher один на всех, и в нем в методе onTextChanged прогоняйте все нужные EditText и проверяйте на непустоту. Для удобства все EditText можно запихать в массив и работать уже с ним.
спасибо большое, воспользовался первым способом, теперь все работает) только там был NumberFormatException :)

Natalia
Сообщения: 15
Зарегистрирован: 03 ноя 2012, 17:09

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

Сообщение Natalia » 03 ноя 2012, 17:13

Эмулятор останавливает приложение после нажатия на равно, в чем ошибка?

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);
}

}

}

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

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

Сообщение rezak90 » 03 ноя 2012, 17:55

Эмулятор останавливает приложение после нажатия на равно, в чем ошибка?
Если бы вы предоставили код ошибки то можно было бы сразу решить проблему. А так могу лишь предположить что происходит NullPointerException или же NumberFormatException, так как при парсинге вы не обрабатываете их.
R.id.team
Политика на форуме запрещена

Ответить