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

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

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

Сообщение rezak90 » 12 ноя 2012, 19:08

в обработчике кнопки:

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

etInput.setText(etInput.getText() + ",");
но вам придётся ещё сначала искать есть ли уже запятая, если есть то уже не добавлять.
R.id.team
Политика на форуме запрещена

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

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

Сообщение Natalia » 12 ноя 2012, 20:34

А что сделать с этим сделать: мое деление выдаёт только целочисленный результат?
case DIVISION:
num1 = result.get(0);
num2 = result.get(1);

result.removeAll(result);

result.add(num1 / num2);

calcDialogDisplay.setText(String.format("%.0f", result.get(0)));
if (num2==0){
Toast.makeText(this, "Деление на ноль запрещено", 1000).show();
calcDialogDisplay.setText("");
return;
}
break;
}

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

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

Сообщение rezak90 » 12 ноя 2012, 20:53

мое деление выдаёт только целочисленный результат?
это вопрос или утверждение? =)
вообще не пойму:
1) зачем использовать стринговый формат, если вы делите 4 на 2, то результат будет 2, а у вас он получится 2.0 (запятая и ноль уже лишнее, зачем?).
2) так же не пойму зачем используете коллекцию что бы хранить там входные данные, а тем более результат.
3) так же не пойму зачем делать проверку на ноль если есть try/catch которые отловят вам любую ошибку, или вы так же будете руками отлавливать деление триллионов на триллионы что даст вам переполнение (хоть в этом я не уверен, в яве не знаю происходит ли переполнение при таких операциях)
P.S. не изобретайте велосипед, в яве есть класс Math, который создан что бы считать. У вас уменьшится код, так же уменьшится количество отлавливаемых ошибок, и не нужно будет замарачиваться с выводом.
R.id.team
Политика на форуме запрещена

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

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

Сообщение Natalia » 12 ноя 2012, 21:21

rezak90 писал(а):
мое деление выдаёт только целочисленный результат?
это вопрос или утверждение? =)
вообще не пойму:
1) зачем использовать стринговый формат, если вы делите 4 на 2, то результат будет 2, а у вас он получится 2.0 (запятая и ноль уже лишнее, зачем?).
2) так же не пойму зачем используете коллекцию что бы хранить там входные данные, а тем более результат.
3) так же не пойму зачем делать проверку на ноль если есть try/catch которые отловят вам любую ошибку, или вы так же будете руками отлавливать деление триллионов на триллионы что даст вам переполнение (хоть в этом я не уверен, в яве не знаю происходит ли переполнение при таких операциях)
P.S. не изобретайте велосипед, в яве есть класс Math, который создан что бы считать. У вас уменьшится код, так же уменьшится количество отлавливаемых ошибок, и не нужно будет замарачиваться с выводом.
вопрос: как не использовать String.format? =)

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

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

Сообщение Natalia » 12 ноя 2012, 23:29

Сделала в Float,
У меня теперь результат не выводится, в чем ошибка? что дописать? что исправить?
public class MainActivity extends Activity {
EditText calcDialogDisplay;
TextView allClear;
TextView seven;
TextView eight;
TextView nine;
TextView division;
TextView four;
TextView five;
TextView six;
TextView multiply;
TextView one;
TextView two;
TextView three;
TextView subtract;
TextView zero;
TextView equals;
TextView addition;
TextView com;



//Первое введенное число
float num1;
//Второе введенное число
float num2;
//результат
float result;

int currentOperation = 0;
int nextOperation;

//Прибавление
final static int ADD = 1;
//Вычитание
final static int SUBTRACT = 2;
//Умножение
final static int MULTIPLY = 3;
//Деление
final static int DIVISION = 4;
//Равно
final static int EQUALS = 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);
//находим элементы
calcDialogDisplay = (EditText) findViewById(R.id.editText1);
allClear = (TextView) findViewById(R.id.button22);
seven = (TextView) findViewById(R.id.button11);
eight = (TextView) findViewById(R.id.button12);
nine = (TextView) findViewById(R.id.button13);
division =(TextView) findViewById(R.id.button9);
four = (TextView) findViewById(R.id.button6);
five = (TextView) findViewById(R.id.button7);
six =(TextView) findViewById(R.id.button8);
multiply = (TextView) findViewById(R.id.button10);
one = (TextView) findViewById(R.id.button1);
two = (TextView) findViewById(R.id.button2);
three = (TextView) findViewById(R.id.button3);
subtract = (TextView) findViewById(R.id.button5);
zero = (TextView) findViewById(R.id.button20);
equals = (TextView) findViewById(R.id.button14);
addition = (TextView) findViewById(R.id.button4);
com = (TextView) findViewById(R.id.button15);
calcDialogDisplay.setKeyListener(DigitsKeyListener.getInstance(true,true));
registerListeners();

}

//Обработка нажатия на экран
public void registerListeners () {
com.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
calcDialogDisplay.setText(calcDialogDisplay.getText() + ".");
}
});


zero.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("0");
}
});

one.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("1");
}
});
two.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("2");
}
});
three.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("3");
}
});
four.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("4");
}
});
five.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("5");
}
});
six.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("6");
}
});
seven.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("7");
}
});
eight.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("8");
}
});
nine.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
if (clearCalcDisplay == CLEAR) {
calcDialogDisplay.setText("");
}
clearCalcDisplay = DONT_CLEAR;
calcDialogDisplay.append("9");
}
});
addition.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(ADD);
}
});
subtract.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(SUBTRACT);
}
});
multiply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(MULTIPLY);
}
});
division.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(DIVISION);
}
});
equals.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcLogic(EQUALS);
}
});
allClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
calcDialogDisplay.setText("");
num1 = 0;
num2 = 0;
currentOperation = 0;
nextOperation = 0;
}
});
}
//функция расчета введенных значений
private void calcLogic(int operator) {


if (operator !=EQUALS) {
nextOperation = operator;
} else if (operator == EQUALS) {
nextOperation = 0;
}
switch (currentOperation) {

//Прибавление
case ADD:
num1 = Float.parseFloat(calcDialogDisplay.getText().toString());
num2 = Float.parseFloat(calcDialogDisplay.getText().toString());
result = num1 + num2;

calcDialogDisplay.setText(Float.toString(result));
break;
case SUBTRACT:
num1 = Float.parseFloat(calcDialogDisplay.getText().toString());
num2 = Float.parseFloat(calcDialogDisplay.getText().toString());
result = num1 - num2;

calcDialogDisplay.setText(Float.toString(result));
break;
case MULTIPLY:
num1 = Float.parseFloat(calcDialogDisplay.getText().toString());
num2 = Float.parseFloat(calcDialogDisplay.getText().toString());
result = num1 * num2;

calcDialogDisplay.setText(Float.toString(result));
break;
case DIVISION:
num1 = Float.parseFloat(calcDialogDisplay.getText().toString());
num2 = Float.parseFloat(calcDialogDisplay.getText().toString());
result = num1 / num2;

calcDialogDisplay.setText(Float.toString(result));
if (num2==0){
Toast.makeText(this, "Деление на ноль запрещено", 1000).show();
calcDialogDisplay.setText("");
return;
}
break;
}

clearCalcDisplay = CLEAR;
currentOperation = nextOperation;
if (operator == EQUALS) {
num1 = 0;
num2 = 0;
}

}

}

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

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

Сообщение rezak90 » 12 ноя 2012, 23:32

есть класс BigDecimal, если нету сложных операций то можно обойтись и без Math класса, так как BigDecimal умеет делать всё основное, и самое главное у него высокая точность вычислений.

З.Ы. где ошибка и что за ошибка? Ваш код ооочень длинный, почему не использовать один обработчик, зачем на каждую кнопку свой обработчик? ведь код можно уменьшить в три раза и сделать более читабельным.
R.id.team
Политика на форуме запрещена

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

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

Сообщение Natalia » 12 ноя 2012, 23:42

rezak90 писал(а):есть класс BigDecimal, если нету сложных операций то можно обойтись и без Math класса, так как BigDecimal умеет делать всё основное, и самое главное у него высокая точность вычислений.

З.Ы. где ошибка и что за ошибка? Ваш код ооочень длинный, почему не использовать один обработчик, зачем на каждую кнопку свой обработчик? ведь код можно уменьшить в три раза и сделать более читабельным.
Что-то не так с calcDialogDisplay.setText(Float.toString(result));
у меня просто пустое окошко без результата,
а длинный - потому что, брала образец : http://www.cyberforum.ru/android-dev/thread544815.html

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

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

Сообщение rezak90 » 12 ноя 2012, 23:47

не буду оскорблять автора того кода)))
а на счёт:
Что-то не так с calcDialogDisplay.setText(Float.toString(result));
у меня просто пустое окошко без результата
я думал вы мне код ошибок приведёте и хоть строку укажите. Если пусто, отдебажте и посмотрите как считается, посмотри пустой ли result после подсчётов. Почему пусто вариантов может быть море...
R.id.team
Политика на форуме запрещена

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 13 ноя 2012, 12:14

Помогите пожалуйста. Пишу программу на которой 2 кнопки сверху и 2 внизу. по середине едиттекст. нижние 2 кнопки копировать вставить. нужно чтоб копировал в буфер обмена чтоб потом к тексту был доступ из других приложений и ставил из буфера. искал искал не нашел.
Вот код из mainactiviny.java


package com.example.shifr_text;

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;


public class MainActivity extends Activity implements OnClickListener {

EditText etText1;

Button btnCopy;
Button btnPaste;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

etText1 = (EditText) findViewById(R.id.editText1);
btnCopy = (Button) findViewById(R.id.button2);
btnPaste = (Button) findViewById(R.id.button4);


btnCopy.setOnClickListener(this);
btnPaste.setOnClickListener(this);
}

public void onClick(View v) {
// TODO Auto-generated method stub
// по id определеяем кнопку, вызвавшую этот обработчик
@SuppressWarnings("unused")
String text1="";

switch (v.getId()) {
case R.id.button2:
text1 =etText1.getText().toString();
// etText1.setText("Нажата кнопка копи");
break;
case R.id.button4:
etText1.setText("Нажата кнопка вставить");
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Подскажите команду для помещения текста в буфер и обратно пожалуйста.

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

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

Сообщение rezak90 » 13 ноя 2012, 12:31

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

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 13 ноя 2012, 12:56

Спасибо) а не подскажите куда поставить его?))) я только начал изучать)

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

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

Сообщение rezak90 » 13 ноя 2012, 13:16

туда куда душа пожелает))) в обработчик какой то кнопки, которая будет копировать в буфер содержимое поля.
R.id.team
Политика на форуме запрещена

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 13 ноя 2012, 20:17

вот как я сделал. вроде работает но копирует после того как вручную выделять текст. если не сложно подскажите как сделать чтоб он при нажатии весь текст из эдита скопировал. и подскажите как вставить из буфера)))
вот код который я поменял чуток.

String stringYouExtracted = etText1.getText().toString();
int startIndex = etText1.getSelectionStart();
int endIndex = etText1.getSelectionEnd();
stringYouExtracted = ((String) stringYouExtracted).substring(startIndex, endIndex);

if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(stringYouExtracted);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", stringYouExtracted);
clipboard.setPrimaryClip(clip);
}

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

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

Сообщение rezak90 » 13 ноя 2012, 20:44

всё же просто, если без выделения то:
clipboard.setText(etText1.getText().toString());
вставляем
etText1.setText(clipboard.getText);
R.id.team
Политика на форуме запрещена

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 14 ноя 2012, 09:18

break;
case R.id.button2:
// кнопка
// if (TextUtils.isEmpty(etText1.getText().toString())){
// return;
// }
String stringYouExtracted = etText1.getText().toString();
int startIndex = etText1.getSelectionStart();
int endIndex = etText1.getSelectionEnd();
text1 = ((String) text1).substring(startIndex, endIndex);
Object collection;

if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(text1);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text1);
clipboard.setPrimaryClip(clip);
clipboard.setText(etText1.getText().toString());
}
// text1 =etText1.getText().toString();
// tvOut.setText("Нажата кнопка копир");
break;

case R.id.button4:
// кнопка
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(text1);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text1);
clipboard.setPrimaryClip(clip);
etText1.setText(clipboard.getText());
}
// etText1.setText("Нажата кнопка вставить");
break;


вставить не работает( может все дело в апи? у меня стоит 16. копировать работает один раз. второй раз нажимаешь вылетает с ошибкой

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

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

Сообщение rezak90 » 14 ноя 2012, 10:39

дело в копипасте)))
раз нажимаешь вылетает с ошибкой
лог ошибок в студию!
R.id.team
Политика на форуме запрещена

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 15 ноя 2012, 11:31

лог ошибок.
Изображение

а это если в коде удалить код и оставить только одну строку вставить, то он не распознается. когда рекомендуемое нажимаю то другие ошибки возникают

Изображение

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

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

Сообщение rezak90 » 15 ноя 2012, 11:54

ну вот, он же вам красиво говорит StringOutOfBoundsException
а вылетает наверное сдесь:

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

text1 = ((String) text1).substring(startIndex, endIndex);
так что внимательней смотрите что вы копируете во второй раз
R.id.team
Политика на форуме запрещена

G_O_R
Сообщения: 57
Зарегистрирован: 13 ноя 2012, 08:02

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

Сообщение G_O_R » 15 ноя 2012, 13:11

Спасибо что указали) простите за глупые вопросы) я только начал изучать. поставил условие чтоб не вылетал.

case R.id.button2:
// кнопка
// if (TextUtils.isEmpty(etText1.getText().toString())){
// return;
// }
if (startIndex<endIndex){
String stringYouExtracted = etText1.getText().toString();

text1 = ((String) text1).substring(startIndex, endIndex);
Object collection;


if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) {
android.text.ClipboardManager clipboard = (android.text.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setText(text1);
} else {
android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
android.content.ClipData clip = android.content.ClipData.newPlainText("Copied Text", text1);
clipboard.setPrimaryClip(clip);
clipboard.setText(etText1.getText().toString());
}
}
else
{
Toast.makeText(this, "Поставьте курсив в начало сообщения и после нажмите копировать", Toast.LENGTH_LONG).show();

}

подскажите код чтоб вставит пожалуйста. кстати апи обновился сегодня, теперь 17. спасибо еще раз за помощь)

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

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

Сообщение rezak90 » 15 ноя 2012, 14:27

у вас же уже есть код вставки: clipboard.getText();
R.id.team
Политика на форуме запрещена

Ответить