Страница 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 раза :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 Надеюсь к критике вы отнесётесь разумно.

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>

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

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

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

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

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, так как при парсинге вы не обрабатываете их.