Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 18 июн 2019, 17:51

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 264 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 14  След.
Автор Сообщение
СообщениеДобавлено: 19 сен 2012, 20:07 

Зарегистрирован: 10 сен 2012, 11:58
Сообщений: 103
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Идея такая, что при нажатии = осуществляется проверка. Если ранее нажимался +, то:

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

если -

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

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 сен 2012, 20:12 

Зарегистрирован: 10 сен 2012, 11:58
Сообщений: 103
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Понимаю, что путаюсь в логической последовательности действий, но не могу понять где ошибка.
И опять таки, почему if срабатывает в case R.id.btn_1, case R.id.btn_2 и во всех оcтальных, но не хочет в case R.id.btnEq ?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 19 сен 2012, 23:55 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
dil_android хотелось бы помочь, но код жутко не читабелен. Поработайте над правописанием (не русского языка) кода. Та и сама логика приложение не понятна и странная - посмотрел первые строки и я так понял у вас три поля ввода (два поля для ввода чисел и один для операторов), такое в голове не укладывается, что пользователь ещё должен вводить даже тот же оператор. В Андроиде есть стандартный калькулятор, посмотрите как он выглядит и сделайте по аналогии, если получится то добавляйте уже свои функции.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 04:28 

Зарегистрирован: 10 сен 2012, 11:58
Сообщений: 103
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Да, извините. Выкладывал после того, как уже совсем ничего не понимал.
Создал пять полей ввода:
два для чисел etNum_1 и etNum_2
одно для операторов (+, -, *, /) et_sign
одно для оператора (=) et_equals
и одно для отображения результата etNum_3
Идея, превратить в дальнейшем этот калькулятор в детский, оперирующий только целыми числами и в пределах одного знака (для этого в <EditText> используется android:maxLength="1"). Так как в дальнейшем хочу анимировать цифры и операторы, подумал, что имея отдельные view компоненты, как например <EditText>, далее можно будет проще и легче обращаться с ними при программировании анимации.
Понимаю,что вопрос не в рамках Урока, но хотелось бы довести до конца то, над чем сидел выходные.
Заранее спасибо.
Здесь полный код:

[code=Java]
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("=");


// здесь, выставляя 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 программа будет ругаться




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

[/code]

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 10:07 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
1) про красоту кода я уже говорил, повторятся не буду;

2) повторения кода на каждой кнопке, не ужели нельзя вынести вот этот блок:

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. case R.id.btnAdd:
  2.                 et_sign.setText("+");
  3.                 if (etNum_1.isFocused()) {
  4.                     etNum_1.clearFocus();
  5.                     etNum_2.isFocusable();
  6.                     etNum_2.requestFocus();
  7.                 } else {
  8.                     etNum_2.isFocused();
  9.                     etNum_2.clearFocus();
  10.                 }
  11.                 num_a = num;
  12.                 break;
  13.             case R.id.btnSub:
  14.                 et_sign.setText("-");
  15.                 if (etNum_1.isFocused()) {
  16.                     etNum_1.clearFocus();
  17.                     etNum_2.isFocusable();
  18.                     etNum_2.requestFocus();
  19.                 } else {
  20.                     etNum_2.isFocused();
  21.                     etNum_2.clearFocus();
  22.                 }
  23.                 num_a = num;
  24.                 break;
  25.             case R.id.btnMult:
  26.                 et_sign.setText("*");
  27.                 if (etNum_1.isFocused()) {
  28.                     etNum_1.clearFocus();
  29.                     etNum_2.isFocusable();
  30.                     etNum_2.requestFocus();
  31.                 } else {
  32.                     etNum_2.isFocused();
  33.                     etNum_2.clearFocus();
  34.                 }
  35.                 break;
  36.             case R.id.btnDiv:
  37.                 et_sign.setText("/");
  38.                 if (etNum_1.isFocused()) {
  39.                     etNum_1.clearFocus();
  40.                     etNum_2.isFocusable();
  41.                     etNum_2.requestFocus();
  42.                 } else {
  43.                     etNum_2.isFocused();
  44.                     etNum_2.clearFocus();
  45.                 }
  46.                 break;


у вас один и тот же код повторяется 4 раза :shock:

3) :?: в чём смысл этих строк:

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. if (etNum_1.isFocused()) {
  2.                     etNum_1.clearFocus();
  3.                     etNum_2.isFocusable(); // вот эта
  4.                     etNum_2.requestFocus();
  5.                 } else {
  6.                     etNum_2.isFocused(); // и вот эта
  7.                     etNum_2.clearFocus();
  8.                 }


они делают проверку и возвращают иситну или ложь, what for?

4) я так и не понял зачем использовать поля ввода, если можно минимизировать всё повесив кнопки, при этом количество кода уменьшится и вероятность ввода человеком нежелательных значений отпадает;

5) не вижу не одной проверки на введённые данные. Если пользователь введёт не число а "йцпупйцуйцун" ? будет фейл :) Что бы с этим не заморачиваться смотрите выше;

P.S. Мой вывод - это велосипед индусского производства :(
P.P.S Надеюсь к критике вы отнесётесь разумно.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 11:23 

Зарегистрирован: 10 сен 2012, 11:58
Сообщений: 103
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Спасибо за ответ. Сам понимаю, что код написан коряво, но на то есть свои причины:

1.Как уже писал ранее, не силен в программировании, но очень хочется восстановить знания полученные когда-то, и заодно научиться делать это, по крайней мере хорошо, в Android.

2. (ссылка на пункт 1.) Прежде чем оптимизировать код, хочу убедиться в том, что логическая последовательность действий правильна и весь этот велосипед сможет ехать.

Теперь по вашим замечаниям:

5. проверки еще не писал, но о них думал (например, деление на ноль). Что писать (наверняка деление на ноль, accidental input, что еще?) буду решать после.

4. объясните пожалуйста, что означает "минимизировать все повесив кнопки". Кнопки описаны в main и вызывают метод onButtonClick(View view) строкой <android:onClick="onButtonClick">;

3.смысл строки в следующем. Как только открывается приложение, поле ввода etNum_1 автоматом находится в фокусе. После того как вводится числовое значение в etNum_1 и нажимается (+, -, *, /) происходит проверка
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. if (etNum_1.isFocused()) {
  2.                     etNum_1.clearFocus();
  3.                     etNum_2.isFocusable();
  4.                     etNum_2.requestFocus();
  5.                 } else {
  6.                     etNum_2.isFocused();
  7.                     etNum_2.clearFocus();
  8.                 }
  9.  

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

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

Спасибо.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 11:31 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Цитата:
Вот тут меня начинает клинить, и возникает вопрос: почему не срабатывает if

потому что по нажатию на кнопку фокус передаётся ей и по этому isFocused() будет возвращать false

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 11:49 

Зарегистрирован: 10 сен 2012, 11:58
Сообщений: 103
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
т.е., вопрос в согласованности времен?
нажав кнопку = я не могу спросить нажималась ли до этого кнопка + ???


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 11:55 

Зарегистрирован: 10 сен 2012, 11:58
Сообщений: 103
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
что в этом случае делать?
как проверить была ли нажата btn_Add?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 20 сен 2012, 11:57 

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 сен 2012, 04:40 

Зарегистрирован: 10 сен 2012, 11:58
Сообщений: 103
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Спасибо большое math64,

После того, как вы дали направление, получилось следующее:

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class MainActivity extends Activity {
  2.  
  3.     int num_1 = 0;
  4.     int num_2 = 0;
  5.     int result = 0;
  6.    
  7.     boolean operand;
  8.     boolean firstTextField_isFull;
  9.    
  10.     String textValue = "";
  11.    
  12.     TextView etNum_1; // объявляю поле ввода первого значения
  13.     TextView et_sign; // поле ввода знака (+,-,*,/)
  14.     TextView etNum_2; // поле ввода второго значения
  15.     TextView et_equals; //поле ввода знака равно (=)
  16.     TextView etNum_3; //поле результата
  17.  
  18.     ImageButton button_Add;
  19.     ImageButton button_Sub;
  20.     ImageButton button_Mult;
  21.     ImageButton button_Div;
  22.  
  23.     /**
  24.      * Called when the activity is first created.
  25.      */
  26.     @Override
  27.     public void onCreate(Bundle savedInstanceState) {
  28.         super.onCreate(savedInstanceState);
  29.         setContentView(R.layout.main);
  30.  
  31.         etNum_1 = (TextView) findViewById(R.id.etNum_1);
  32.         et_sign = (TextView) findViewById(R.id.et_sign);
  33.         etNum_2 = (TextView) findViewById(R.id.etNum_2);
  34.         et_equals = (TextView) findViewById(R.id.et_equals);
  35.         etNum_3 = (TextView) findViewById(R.id.etNum_3);
  36.  
  37.         button_Add = (ImageButton) findViewById(R.id.btnAdd); // кнопка сложения
  38.         button_Sub = (ImageButton) findViewById(R.id.btnSub); // кнопка вычитания
  39.         button_Mult = (ImageButton) findViewById(R.id.btnMult);
  40.         button_Div = (ImageButton) findViewById(R.id.btnDiv);
  41.  
  42.         etNum_1.setText("");
  43.         etNum_2.setText("");
  44.         etNum_3.setText("");
  45.     }
  46.  
  47.     public void onButtonClick(View view) {
  48.  
  49.         switch (view.getId()) {
  50.  
  51.             case R.id.btnAdd:
  52.                 et_sign.setText("+");
  53.                 firstTextField_isFull = true;
  54.                 operand = true;
  55.                 break;
  56.  
  57.             case R.id.btnSub:
  58.                 et_sign.setText("-");
  59.                 firstTextField_isFull = true;
  60.                 operand = false;
  61.                 break;
  62.  
  63.             case R.id.btnMult:
  64.                 et_sign.setText("*");
  65.                 firstTextField_isFull = true;
  66.                 operand = true;
  67.                 break;
  68.  
  69.             case R.id.btnDiv:
  70.                 et_sign.setText("/");
  71.                 firstTextField_isFull = true;
  72.                 operand = false;
  73.                 break;
  74.  
  75.             case R.id.btnEq:
  76.                 et_equals.setText("=");
  77.                 if (operand == true) {
  78.                     result = num_1 + num_2;
  79.                 } else {
  80.                     result = num_1 - num_2;
  81.                 }
  82.  
  83.                 if (operand == true) {
  84.                     result = num_1 * num_2;
  85.                 } else {
  86.                     result = num_1 / num_2;
  87.                 }
  88.  
  89.                 etNum_3.setText(Integer.toString(result));
  90.                 firstTextField_isFull = false;
  91.                 break;
  92.  
  93.             case R.id.btn_1:
  94.                 textValue = "";
  95.                 if (firstTextField_isFull == false) {
  96.                     etNum_1.setText(textValue + "1");
  97.                     textValue = etNum_1.getText().toString();
  98.                     num_1 = Integer.parseInt(textValue);
  99.                 } else {
  100.                     etNum_2.setText(textValue + "1");
  101.                     textValue = etNum_2.getText().toString();
  102.                     num_2 = Integer.parseInt(textValue);
  103.                 }
  104.                 break;
  105.  
  106.             case R.id.btn_2:
  107.                 textValue = "";
  108.                 if (firstTextField_isFull == false) {
  109.                     etNum_1.setText(textValue + "2");
  110.                     textValue = etNum_1.getText().toString();
  111.                     num_1 = Integer.parseInt(textValue);
  112.                 } else {
  113.                     etNum_2.setText(textValue + "2");
  114.                     textValue = etNum_2.getText().toString();
  115.                     num_2 = Integer.parseInt(textValue);
  116.                 }
  117.                 break;
  118.  
  119.             case R.id.btn_3:
  120.                 textValue = "";
  121.                 if (firstTextField_isFull == false) {
  122.                     etNum_1.setText(textValue + "3");
  123.                     textValue = etNum_1.getText().toString();
  124.                     num_1 = Integer.parseInt(textValue);
  125.                 } else {
  126.                     etNum_2.setText(textValue + "3");
  127.                     textValue = etNum_2.getText().toString();
  128.                     num_2 = Integer.parseInt(textValue);
  129.                 }
  130.                 break;
  131.  
  132.             case R.id.btn_4:
  133.                 textValue = "";
  134.                 if (firstTextField_isFull == false) {
  135.                     etNum_1.setText(textValue + "4");
  136.                     textValue = etNum_1.getText().toString();
  137.                     num_1 = Integer.parseInt(textValue);
  138.                 } else {
  139.                     etNum_2.setText(textValue + "4");
  140.                     textValue = etNum_2.getText().toString();
  141.                     num_2 = Integer.parseInt(textValue);
  142.                 }
  143.                 break;
  144.       }
  145.    }
  146. }
  147.  
  148.  


намного, намного красивше и мне кажется более читабельно чем было. Главное, я избавился от focus.
однако программа, при вызове, упорно пытается убедить меня, что 1+1=1, а 1+2=2, такая же ситуация с вычитанием.
Умножение и деление проходят нормально.
Подскажите, где я допускаю ошибку.

P.S.Что касается проверок, то единственные, которые нужно будет писать, это деление на ноль и отрицательное значение при вычитании. Вводить буквенные или другие значения не получится, так как в </TextView> для операндов есть android:digits="+-*/", а для числовых значений android:inputType="number"


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 сен 2012, 09:13 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
Потому, что переменная operand должна быть типа char и принимать значения '+', '-', '*', '/' и 0 (не выбрано) (PS: в Unicode есть символы '×' и '÷' - можешь использовать их)
У тебя она типа boolean и не может отличить + от * и после сложения делает умножение, которое затирает результат сложения.

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 сен 2012, 09:43 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
а калькулятор только целые числа считает? вещественные не нужно?! и результаты в целые))) 5/2=2 хД)

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 сен 2012, 14:51 

Зарегистрирован: 10 сен 2012, 11:58
Сообщений: 103
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Как говорил один мой знакомый: "Я не тупой, а просто малознающий". Начну со слов благодарности math64 и rezak90. Особенно помогли последние комменты от math64. Без вашей помощи я не смог бы написать, по настоящему свою, первую программу в Android. Теперь по делу:

1. написал следующие проверки

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.             case R.id.btnEq:
  2.                 et_equals.setText("=");
  3.  
  4.                 if (calc == '+') {
  5.                     result = num_1 + num_2;
  6.                 } else {
  7.                     if (calc == '-') {
  8.                         if (num_2 > num_1) {
  9.                            
  10.                             Toast.makeText(this, "Мы этого еще не проходили", 1000).show();
  11.                             et_sign.setText("");
  12.                             et_equals.setText("");
  13.                             etNum_3.setText("");
  14.                             etNum_2.setText("");
  15.                             etNum_1.setText("");
  16.                             firstTextField_isFull = false;
  17.  
  18.                             return;
  19.                         } else {
  20.                             result = num_1 - num_2;
  21.                         }
  22.                     }
  23.                 }
  24.  
  25.                 if (calc == '*') {
  26.                     result = num_1 * num_2;
  27.                 } else {
  28.                     if (calc == '/') {
  29.                         if (num_1 < num_2 || num_2 == 0) {
  30.  
  31.                             Toast.makeText(this, "Мы этого еще не проходили", 1000).show();
  32.                             et_sign.setText("");
  33.                             et_equals.setText("");
  34.                             etNum_3.setText("");
  35.                             etNum_2.setText("");
  36.                             etNum_1.setText("");
  37.                             firstTextField_isFull = false;
  38.  
  39.                             return;
  40.  
  41.                         } else {
  42.                             result = num_1 / num_2;
  43.                         }
  44.                     }
  45.                 }
  46.  
  47.                 etNum_3.setText(Integer.toString(result));
  48.                 firstTextField_isFull = false;
  49.                 break;
  50.  


и читая последний коммент от rezak90 понял, что упустил еще одну, а именно деление, при котором получается не целочисленное значение (например 9/2). Сразу вопрос: есть ли какой нибудь метод, проверяющий, если число на выходе не int a float или double например?

2. Надо будет оптимизировать код на защиту от дурака, а именно повторные нажатия кнопок операндов и т.д. Особенно актуально если из этой заготовки действительно получится хороший, детский, анимированный калькулятор.
Надо еще добавить кнопку ClearAll, чтобы очищать все поля и т.д.

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

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 21 сен 2012, 15:23 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Проверок как таковых нету. Можно првоерять на остаток, если остаток не равен нулю то результат вещественный. Но это велосипед.
Я когда писал свой первый калькулятор то реализовывал всё через класс Math - специальный класс для математических вычислений в Java. Он может всё =) И у него погрешность очень маленькая или вообще нету. Я где то читал что оракл рекомендуют использовать его для финансовых вычислений, потому как у него точность составляет 100000 знаков после запятой.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 27 окт 2012, 15:02 

Зарегистрирован: 08 авг 2012, 14:41
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте! Недавно понадобилось написать программу для подсчета определителя, дабы облегчить себе жизнь на уроках! Сказано - сделано! Вот приложение, но с одним маленьким косяком, о котором после кода:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. package com.example.determinant;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.text.TextUtils;
  6. import android.view.Menu;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11. import android.widget.TextView;
  12.  
  13. public class Determinant extends Activity implements OnClickListener {
  14.        
  15.         EditText x1_s, x2_s, x3_s;
  16.     EditText y1_s, y2_s, y3_s;
  17.     EditText z1_s, z2_s, z3_s;
  18.    
  19.     int x1, x2, x3;
  20.     int y1, y2, y3;  
  21.     int z1, z2, z3;
  22.    
  23.     int otvet;
  24.    
  25.     String otvet_s;
  26.    
  27.     Button btnResult;
  28.     Button clear;
  29.    
  30.     TextView otvet_text;
  31.        
  32.     @Override
  33.     public void onCreate(Bundle savedInstanceState) {
  34.         super.onCreate(savedInstanceState);
  35.         setContentView(R.layout.main);
  36.        
  37.         x1_s = (EditText) findViewById(R.id.x1);
  38.         x2_s = (EditText) findViewById(R.id.x2);
  39.         x3_s = (EditText) findViewById(R.id.x3);
  40.        
  41.         y1_s = (EditText) findViewById(R.id.y1);
  42.         y2_s = (EditText) findViewById(R.id.y2);
  43.         y3_s = (EditText) findViewById(R.id.y3);
  44.        
  45.         z1_s = (EditText) findViewById(R.id.z1);
  46.         z2_s = (EditText) findViewById(R.id.z2);
  47.         z3_s = (EditText) findViewById(R.id.z3);
  48.        
  49.        
  50.         btnResult = (Button) findViewById(R.id.btnResult);
  51.         clear = (Button) findViewById(R.id.clear);
  52.        
  53.         otvet_text = (TextView) findViewById(R.id.otvet);
  54.        
  55.         clear.setOnClickListener(this);
  56.         btnResult.setOnClickListener(this);
  57.  
  58.     }
  59.    
  60.     public void onClick(View v) {
  61.                 // TODO Auto-generated method stub
  62.                
  63.         switch (v.getId())
  64.         {
  65.                 case R.id.clear:
  66.                         x1_s.setText("");
  67.                         x2_s.setText("");
  68.                 x3_s.setText("");
  69.                
  70.                 y1_s.setText("");
  71.                 y2_s.setText("");
  72.                 y3_s.setText("");
  73.                
  74.                 z1_s.setText("");
  75.                 z2_s.setText("");
  76.                 z3_s.setText("");
  77.                
  78.                 otvet_text.setText("");
  79.                
  80.                 break;
  81.                
  82.                 case R.id.btnResult:
  83.                         x1 = Integer.parseInt(x1_s.getText().toString());
  84.                         x2 = Integer.parseInt(x2_s.getText().toString());
  85.                         x3 = Integer.parseInt(x3_s.getText().toString());
  86.                        
  87.                         y1 = Integer.parseInt(y1_s.getText().toString());
  88.                         y2 = Integer.parseInt(y2_s.getText().toString());
  89.                         y3 = Integer.parseInt(y3_s.getText().toString());
  90.                        
  91.                         z1 = Integer.parseInt(z1_s.getText().toString());
  92.                         z2 = Integer.parseInt(z2_s.getText().toString());
  93.                         z3 = Integer.parseInt(z3_s.getText().toString());
  94.                        
  95.                         otvet = x1*y2*z3 + x2*y3*z1 + x3*z2*y1 - x3*y2*z1 - x2*y1*z3 - x1*z2*y3;
  96.                         otvet_s = Integer.toString(otvet);
  97.                        
  98.                         otvet_text.setText(otvet_s);
  99.                        
  100.                         break;
  101.         }
  102.         }
  103.  
  104.     @Override
  105.     public boolean onCreateOptionsMenu(Menu menu) {
  106.         getMenuInflater().inflate(R.menu.main, menu);
  107.         return true;
  108.     }
  109. }


Код: [ Загрузить ] [ Скрыть ]
Using XML Syntax Highlighting
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.    xmlns:tools="http://schemas.android.com/tools"
  3.    android:layout_width="match_parent"
  4.    android:layout_height="match_parent" >
  5.  
  6.     <RelativeLayout
  7.        android:layout_width="match_parent"
  8.        android:layout_height="match_parent" >
  9.  
  10.         <EditText
  11.            android:id="@+id/x1"
  12.            android:layout_width="80dp"
  13.            android:layout_height="wrap_content"
  14.            android:layout_alignParentTop="true"
  15.            android:layout_marginLeft="10dp"
  16.            android:layout_marginTop="15dp"
  17.            android:ems="10"
  18.            android:hint="x1"
  19.            android:inputType="numberSigned"
  20.            android:maxLength="6" />
  21.  
  22.         <EditText
  23.            android:id="@+id/y1"
  24.            android:layout_width="80dp"
  25.            android:layout_height="wrap_content"
  26.            android:layout_alignBaseline="@+id/x1"
  27.            android:layout_alignBottom="@+id/x1"
  28.            android:layout_centerHorizontal="true"
  29.            android:ems="10"
  30.            android:hint="y1"
  31.            android:inputType="numberSigned"
  32.            android:maxLength="6" />
  33.  
  34.         <EditText
  35.            android:id="@+id/z1"
  36.            android:layout_width="80dp"
  37.            android:layout_height="wrap_content"
  38.            android:layout_alignBaseline="@+id/y1"
  39.            android:layout_alignBottom="@+id/y1"
  40.            android:layout_alignParentRight="true"
  41.            android:layout_marginRight="14dp"
  42.            android:ems="10"
  43.            android:hint="z1"
  44.            android:inputType="numberSigned"
  45.            android:maxLength="6" />
  46.  
  47.         <EditText
  48.            android:id="@+id/x2"
  49.            android:layout_width="wrap_content"
  50.            android:layout_height="wrap_content"
  51.            android:layout_alignLeft="@+id/x1"
  52.            android:layout_alignRight="@+id/x1"
  53.            android:layout_below="@+id/x1"
  54.            android:layout_marginTop="31dp"
  55.            android:ems="10"
  56.            android:hint="x2"
  57.            android:inputType="numberSigned"
  58.            android:maxLength="6" >
  59.  
  60.             <requestFocus />
  61.         </EditText>
  62.  
  63.         <EditText
  64.            android:id="@+id/y2"
  65.            android:layout_width="wrap_content"
  66.            android:layout_height="wrap_content"
  67.            android:layout_alignBaseline="@+id/x2"
  68.            android:layout_alignBottom="@+id/x2"
  69.            android:layout_alignLeft="@+id/y1"
  70.            android:layout_alignRight="@+id/y1"
  71.            android:ems="10"
  72.            android:hint="y2"
  73.            android:inputType="numberSigned"
  74.            android:maxLength="6" />
  75.  
  76.         <EditText
  77.            android:id="@+id/z2"
  78.            android:layout_width="wrap_content"
  79.            android:layout_height="wrap_content"
  80.            android:layout_alignBaseline="@+id/y2"
  81.            android:layout_alignBottom="@+id/y2"
  82.            android:layout_alignLeft="@+id/z1"
  83.            android:layout_alignRight="@+id/z1"
  84.            android:ems="10"
  85.            android:hint="z2"
  86.            android:inputType="numberSigned"
  87.            android:maxLength="6" />
  88.  
  89.         <EditText
  90.            android:id="@+id/x3"
  91.            android:layout_width="wrap_content"
  92.            android:layout_height="wrap_content"
  93.            android:layout_alignLeft="@+id/x2"
  94.            android:layout_alignRight="@+id/x2"
  95.            android:layout_below="@+id/x2"
  96.            android:layout_marginTop="34dp"
  97.            android:ems="10"
  98.            android:hint="x3"
  99.            android:inputType="numberSigned"
  100.            android:maxLength="6" />
  101.  
  102.         <EditText
  103.            android:id="@+id/y3"
  104.            android:layout_width="wrap_content"
  105.            android:layout_height="wrap_content"
  106.            android:layout_alignBaseline="@+id/x3"
  107.            android:layout_alignBottom="@+id/x3"
  108.            android:layout_alignLeft="@+id/y2"
  109.            android:layout_alignRight="@+id/y2"
  110.            android:ems="10"
  111.            android:hint="y3"
  112.            android:inputType="numberSigned"
  113.            android:maxLength="6" />
  114.  
  115.         <EditText
  116.            android:id="@+id/z3"
  117.            android:layout_width="wrap_content"
  118.            android:layout_height="wrap_content"
  119.            android:layout_alignBaseline="@+id/y3"
  120.            android:layout_alignBottom="@+id/y3"
  121.            android:layout_alignLeft="@+id/z2"
  122.            android:layout_alignRight="@+id/z2"
  123.            android:ems="10"
  124.            android:hint="z3"
  125.            android:inputType="numberSigned"
  126.            android:maxLength="6" />
  127.  
  128.         <TextView
  129.            android:id="@+id/textView1"
  130.            android:layout_width="wrap_content"
  131.            android:layout_height="wrap_content"
  132.            android:layout_alignParentBottom="true"
  133.            android:layout_alignParentLeft="true"
  134.            android:layout_marginBottom="51dp"
  135.            android:layout_marginLeft="16dp"
  136.            android:text="Определитель: "
  137.            android:textAppearance="?android:attr/textAppearanceLarge" />
  138.  
  139.         <TextView
  140.            android:id="@+id/otvet"
  141.            android:layout_width="wrap_content"
  142.            android:layout_height="wrap_content"
  143.            android:layout_alignBottom="@+id/textView1"
  144.            android:layout_alignRight="@+id/z3"
  145.            android:layout_alignTop="@+id/textView1"
  146.            android:layout_toRightOf="@+id/textView1"
  147.            android:textAppearance="?android:attr/textAppearanceLarge" />
  148.  
  149.         <Button
  150.            android:id="@+id/btnResult"
  151.            android:layout_width="match_parent"
  152.            android:layout_height="wrap_content"
  153.            android:layout_alignParentLeft="true"
  154.            android:layout_below="@+id/x3"
  155.            android:layout_marginLeft="10dp"
  156.            android:layout_marginRight="10dp"
  157.            android:layout_marginTop="38dp"
  158.            android:text="СЧИТАЙ ОПРЕДЕЛИТЕЛЬ!" />
  159.  
  160.         <Button
  161.            android:id="@+id/clear"
  162.            android:layout_width="match_parent"
  163.            android:layout_height="wrap_content"
  164.            android:layout_alignLeft="@+id/btnResult"
  165.            android:layout_alignRight="@+id/btnResult"
  166.            android:layout_below="@+id/btnResult"
  167.            android:text="ОЧИСТЬ ВСЕ!" />
  168.  
  169.     </RelativeLayout>
  170.  
  171. </LinearLayout>



Так вот: если не заполнить поля и нажать на кнопку подсчета, то программа крашится, т.к. в ней нет значений! Я хочу сделать эту кнопку неактивной, т.е.
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. btnResult.setEnable(false);
, но как прикрутить к этому
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. if (TextUtils.isEmpty(etNum1.getText().toString())
  2.         || TextUtils.isEmpty(etNum2.getText().toString())) {
  3.       return;
  4.     }


В правильном ли я направлении думаю и не слишком громоздко ли получится?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 окт 2012, 10:45 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Sevak писал(а):
Я хочу сделать эту кнопку неактивной

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

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

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 окт 2012, 12:29 

Зарегистрирован: 08 авг 2012, 14:41
Сообщений: 6
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
damager82 писал(а):
Sevak писал(а):
Я хочу сделать эту кнопку неактивной

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

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


спасибо большое, воспользовался первым способом, теперь все работает) только там был NumberFormatException :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 ноя 2012, 17:13 

Зарегистрирован: 03 ноя 2012, 17:09
Сообщений: 15
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Эмулятор останавливает приложение после нажатия на равно, в чем ошибка?

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

}

}


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 ноя 2012, 17:55 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
Цитата:
Эмулятор останавливает приложение после нажатия на равно, в чем ошибка?

Если бы вы предоставили код ошибки то можно было бы сразу решить проблему. А так могу лишь предположить что происходит NullPointerException или же NumberFormatException, так как при парсинге вы не обрабатываете их.

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 264 ]  На страницу Пред.  1, 2, 3, 4, 5, 6 ... 14  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB