Как сделать калькулятор в андроид студио
Зная некоторые основы компоновки и такие элементы как TextView, EditText и Button, уже можно составить более менее полноценное приложение. В данном случае мы сделаем простенький калькулятор.
Для этого создадим новый проект и определим в файле activity_main.xml следующий интерфейс:
В итоге весь интерфейс будет выглядеть следующим образом:

Корневой контейнер компоновки представляет элемент ConstraintLayout . Сверху в нем определены два текстовых поля TextView: одно для вывода результата вычислений и одно для вывода текущего знака операции.
Затем идет элемент EditText, предназначенный для ввода чисел.
И далее расположены четыре элемента LinearLayout с горизонтальными рядами кнопок. Чтобы все кнопки занимали равное пространство внутри контейнера, для них установлены атрибуты android:layout_weight=»1″ и android:layout_width=»0dp» .
Кроме того, для числовых кнопок в качестве обработчика нажатия установлен метод onNumberClick , а для кнопок со знаками операций атрибут onClick указывает на метод onOperationClick .
Теперь изменим класс MainActivity :
package com.example.viewapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity < TextView resultField; // текстовое поле для вывода результата EditText numberField; // поле для ввода числа TextView operationField; // текстовое поле для вывода знака операции Double operand = null; // операнд операции String lastOperation = "="; // последняя операция @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // получаем все поля по id из activity_main.xml resultField = findViewById(R.id.resultField); numberField = findViewById(R.id.numberField); operationField = findViewById(R.id.operationField); >// сохранение состояния @Override protected void onSaveInstanceState(Bundle outState) < outState.putString("OPERATION", lastOperation); if(operand!=null) outState.putDouble("OPERAND", operand); super.onSaveInstanceState(outState); >// получение ранее сохраненного состояния @Override protected void onRestoreInstanceState(Bundle savedInstanceState) < super.onRestoreInstanceState(savedInstanceState); lastOperation = savedInstanceState.getString("OPERATION"); operand= savedInstanceState.getDouble("OPERAND"); resultField.setText(operand.toString()); operationField.setText(lastOperation); >// обработка нажатия на числовую кнопку public void onNumberClick(View view) < Button button = (Button)view; numberField.append(button.getText()); if(lastOperation.equals("=") && operand!=null)< operand = null; >> // обработка нажатия на кнопку операции public void onOperationClick(View view)< Button button = (Button)view; String op = button.getText().toString(); String number = numberField.getText().toString(); // если введенно что-нибудь if(number.length()>0)< number = number.replace(',', '.'); try< performOperation(Double.valueOf(number), op); >catch (NumberFormatException ex) < numberField.setText(""); >> lastOperation = op; operationField.setText(lastOperation); > private void performOperation(Double number, String operation) < // если операнд ранее не был установлен (при вводе самой первой операции) if(operand ==null)< operand = number; >else < if(lastOperation.equals("="))< lastOperation = operation; >switch(lastOperation) < case "=": operand =number; break; case "/": if(number==0)< operand =0.0; >else < operand /=number; >break; case "*": operand *=number; break; case "+": operand +=number; break; case "-": operand -=number; break; > > resultField.setText(operand.toString().replace('.', ',')); numberField.setText(""); > >
Разберем этот код. Вначале в методе onCreate() получаем все поля из activity_main.xml, текст которых будет изменяться:
resultField = findViewById(R.id.resultField); numberField = findViewById(R.id.numberField); operationField = findViewById(R.id.operationField);
Результат операции будет попадать в переменную operand, которая представляет тип Double, а знак операции — в переменную lastOperation:
Double operand = null; String lastOperation = " brush:java;"> Button button = (Button)view; numberField.append(button.getText()); if(lastOperation.equals(" равно"), то мы сбрасываем переменную operand. В методе onOperationClick происходит обработка нажатия на кнопку со знаком операции:
Button button = (Button)view; String op = button.getText().toString(); String number = numberField.getText().toString(); if(number.length()>0)< number = number.replace(',', '.'); try< performOperation(Double.valueOf(number), op); >catch (NumberFormatException ex) < numberField.setText(""); >> lastOperation = op; operationField.setText(lastOperation);
Здесь получаем ранее введенное число и введенную операцию и передаем их в метод performOperation() . Так как в метод передается не просто строка, а число Double, то нам надо преобразовать строку в чсло. И поскольку теоретически могут быть введены нечисловые символы, то для отлова исключения, которое может возникнуть при преобразовании используется конструкция try. catch.
Кроме того, так как разделителем целой и дробной части в Double в java является точка, то нам надо заменить запятую на точку, так как предполагается, что мы используем в качестве разделителя запятую.
А методе performOperation() выполняем собственно операцию. При вводе первой операции, когда операнд еще не установлен, мы просто устанавливаем операнд:
if(operand ==null)
При вводе второй и последующих операций применяем предыдущую операцию, знак которой хранится в переменной lastOperation, к операнду operand и второму числу, которое было введено в числовое поле. Полученный результат операции сохраняем в переменной operand.
Простой калькулятор на Android
Здравствуйте. Изучаю разработку под Андроид, пишу банальные задачки (сейчас - калькулятор). И вот собственно встал вопрос - строку с выражением я сформировал, как мне теперь её посчитать? Если бы у меня сложный калькулятор, то использовал бы методы обратной польской записи и другие уже известные алгоритмы. Но у меня +, -, *, /. В скриптовых языках я бы использовал что-то вроде eval(), а вот тут запнулся. Помогите, если сталкивались, пожалуйста 🙂
Отслеживать
задан 9 ноя 2012 в 19:47
andrewshka andrewshka
1,615 2 2 золотых знака 30 30 серебряных знаков 60 60 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
main.xml
Activity.java
package calc.calc; 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 CalcActivity extends Activity < /**Переменная текстбокса*/ EditText calcDialogDisplay; /**Переменные кнопок*/ TextView binary; 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 decimal; TextView zero; TextView equals; TextView addition; /**Результат который заносится в масив для обработки*/ ArrayListresult = new ArrayList(); /**Первое введенное число*/ float number1; /**Второе введенное число*/ float number2; 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 DECIMAL = 6; /**Нахождение двоичного числа из целого*/ final static int BINARY = 7; final static int CLEAR = 1; final static int DONT_CLEAR = 0; int clearCalcDisplay = 0; public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); calcDialogDisplay = (EditText) findViewById(R.id.editText1); binary = (TextView) findViewById(R.id.button23); 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); decimal = (TextView) findViewById(R.id.button16); zero = (TextView) findViewById(R.id.button20); equals = (TextView) findViewById(R.id.button14); //addition = (TextView) findViewById(R.id.addition); calcDialogDisplay.setKeyListener(DigitsKeyListener.getInstance(true,true)); registerListeners(); >/*Обработка нажатия на экран*/ public void registerListeners () < 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"); > >); division.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < calcLogic(DIVISION); >>); allClear.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < calcDialogDisplay.setText(""); number1 = 0; number2 = 0; result.removeAll(result); currentOperation = 0; nextOperation = 0; >>); 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"); > >); zero.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < if (clearCalcDisplay == CLEAR) < calcDialogDisplay.setText(""); >clearCalcDisplay = DONT_CLEAR; calcDialogDisplay.append("0"); > >); decimal.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < calcLogic(DECIMAL); >>); multiply.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < calcLogic(MULTIPLY); >>); 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"); > >); subtract.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < calcLogic(SUBTRACT); >>); equals.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < calcLogic(EQUALS); >>); binary.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < calcLogic(BINARY); >>); > /*Функция перевода из десятичного в двоичное значение*/ private float decToBin(float bin) < int i, b; long result = 0; for(i=0; bin >0; i++) < b = (int) (bin % 2); bin = (bin-b)/2; result += b * Math.pow(10,i); >return result; > /*Функция перевода из двличного в десятичное значение*/ private float binToDec(float dec) < int result = 0; int mult = 1; while(dec >0) < result += mult * ((int)dec % 10); dec /= 10; mult *= 2; >return result; > /*Функция расчета введенных значений*/ private void calcLogic(int operator) < result.add(Float.parseFloat(calcDialogDisplay.getText().toString())); if (operator != EQUALS) < nextOperation = operator; >else if (operator == EQUALS) < nextOperation = 0; >switch (currentOperation) < /*Прибавление*/ case ADD: number1 = result.get(0); number2 = result.get(1); result.removeAll(result); result.add(number1 + number2); calcDialogDisplay.setText(String.format("%.0f", result.get(0))); break; /*Вычитание*/ case SUBTRACT: number1 = result.get(0); number2 = result.get(1); result.removeAll(result); result.add(number1 - number2); calcDialogDisplay.setText(String.format("%.0f", result.get(0))); break; /*Умножение*/ case MULTIPLY: number1 = result.get(0); number2 = result.get(1); result.removeAll(result); result.add(number1 * number2); calcDialogDisplay.setText(String.format("%.0f", result.get(0))); break; /*Деление*/ case DIVISION: number1 = result.get(0); number2 = result.get(1); result.removeAll(result); result.add(number1 / number2); calcDialogDisplay.setText(String.format("%.0f", result.get(0))); break; /*Получание двоичного числа*/ case DECIMAL: number2 = result.get(1); result.removeAll(result); result.add(decToBin(number2)); calcDialogDisplay.setText(String.format("%.0f", result.get(0))); break; /*Получение десятичного числа*/ case BINARY: number2 = result.get(1); result.removeAll(result); result.add(binToDec(number2)); calcDialogDisplay.setText(String.format("%.0f", result.get(0))); break; >clearCalcDisplay = CLEAR; currentOperation = nextOperation; if (operator == EQUALS) < number1 = 0; number2 = 0; result.removeAll(result); >> >
Когда - то давно прогал для собеседования
Урок 19. Пишем простой калькулятор
Попробуем написать простейший калькулятор, который берет два числа и проводит с ними операции сложения, вычитания, умножения или деления. Результат отображает в виде полного выражения.
Project name: P0191_SimpleCalculator
Build Target: Android 2.3.3
Application name: SimpleCalculator
Package name: ru.startandroid.develop.simplecalculator
Create Activity: MainActivity
Откроем main.xml и нарисуем экран:
Тут есть два поля ввода, 4 кнопки и текстовое поле для вывода. Обратите внимание на атрибут inputType для EditText. Он задает тип содержимого. Я указал numberDecimal – т.е. в поле получится ввести только цифры и запятую, буквы он не пропустит. Это удобно, не надо самому кодить различные проверки.
Для TextView указан атрибут gravity. Он указывает, как будет расположен текст в TextView. Не путайте с layout_gravity, который отвечает за размещение TextView в ViewGroup.
Теперь нам надо читать содержимое полей, определять какую кнопку нажали и выводить нужный результат. Открываем MainActivity.java и пишем код
public class MainActivity extends Activity implements OnClickListener < EditText etNum1; EditText etNum2; Button btnAdd; Button btnSub; Button btnMult; Button btnDiv; TextView tvResult; String oper = ""; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.main); // находим элементы etNum1 = (EditText) findViewById(R.id.etNum1); etNum2 = (EditText) findViewById(R.id.etNum2); btnAdd = (Button) findViewById(R.id.btnAdd); btnSub = (Button) findViewById(R.id.btnSub); btnMult = (Button) findViewById(R.id.btnMult); btnDiv = (Button) findViewById(R.id.btnDiv); tvResult = (TextView) findViewById(R.id.tvResult); // прописываем обработчик btnAdd.setOnClickListener(this); btnSub.setOnClickListener(this); btnMult.setOnClickListener(this); btnDiv.setOnClickListener(this); >@Override public void onClick(View v) < // TODO Auto-generated method stub float num1 = 0; float num2 = 0; float result = 0; // Проверяем поля на пустоту if (TextUtils.isEmpty(etNum1.getText().toString()) || TextUtils.isEmpty(etNum2.getText().toString())) < return; >// читаем EditText и заполняем переменные числами num1 = Float.parseFloat(etNum1.getText().toString()); num2 = Float.parseFloat(etNum2.getText().toString()); // определяем нажатую кнопку и выполняем соответствующую операцию // в oper пишем операцию, потом будем использовать в выводе switch (v.getId()) < case R.id.btnAdd: oper = "+"; result = num1 + num2; break; case R.id.btnSub: oper = "-"; result = num1 - num2; break; case R.id.btnMult: oper = "*"; result = num1 * num2; break; case R.id.btnDiv: oper = "/"; result = num1 / num2; break; default: break; >// формируем строку вывода tvResult.setText(num1 + " " + oper + " " + num2 + " function"==typeof Object.defineProperties?Object.defineProperty:function(b,c,a),h="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,k=["String","prototype","repeat"],l=0;l);h=h[m]>var n=k[k.length-1],p=h[n],q=p?p:function(b)b||1342177279>>=1)c+=c;return a>;q!=p&&null!=q&&g(h,n,);var t=this;function u(b,c):d[e]=c>;function v(b)return[]>;function w(b)>>;var x;function y(b,c,a,d,e);this.i=d;this.b=<>;this.a=[];this.c=<>>function z(b,c)=c.offsetWidth&&0>=c.offsetHeight)a=!1;elsea&&(b.a.push(e),b.c[e]=!0)>y.prototype.checkImageForCriticality=function(b);u("pagespeed.CriticalImages.checkImageForCriticality",function(b));u("pagespeed.CriticalImages.checkCriticalImages",function());function A(b);for(var c=["IMG","INPUT"],a=[],d=0;d=a.length+e.length&&(a+=e)>b.i&&(e="&rd Msxml2.XMLHTTP")>catch(r)catch(D)<>>f&&(f.open("POST",d+(-1==d.indexOf("?")?"?":"&")+"url="+encodeURIComponent(b)),f.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),f.send(a))>>>function B(),c;c=document.getElementsByTagName("IMG");if(!c.length)return<>;var a=c[0];if(!("naturalWidth"in a&&"naturalHeight"in a))return<>;for(var d=0;a=c[d];++d)=b[e].o&&a.height>=b[e].m)&&(b[e]=)>return b>var C="";u("pagespeed.CriticalImages.getBeaconData",function());u("pagespeed.CriticalImages.Run",function(b,c,a,d,e,f),0)>)>);>)();pagespeed.CriticalImages.Run('/ngx_pagespeed_beacon','https://startandroid.ru/ru/uroki/vse-uroki-spiskom/54-urok-19-pishem-prostoj-kalkuljator.html','idYwwreXdc',true,false,'FeS6OScauN0');
Давайте для большего функционала сделаем меню с пунктами очистки полей и выхода из приложения. Пункты будут называться Reset и Quit.
Добавим две константы – это будут ID пунктов меню.
public class MainActivity extends Activity implements OnClickListener < final int MENU_RESET_ID = 1; final int MENU_QUIT_ID = 2; EditText etNum1;
(добавляете только строки 3 и 4)
И напишем код создания и обработки меню:
// создание меню @Override public boolean onCreateOptionsMenu(Menu menu) < menu.add(0, MENU_RESET_ID, 0, "Reset"); menu.add(0, MENU_QUIT_ID, 0, "Quit"); return super.onCreateOptionsMenu(menu); >// обработка нажатий на пункты меню @Override public boolean onOptionsItemSelected(MenuItem item) < switch (item.getItemId()) < case MENU_RESET_ID: // очищаем поля etNum1.setText(""); etNum2.setText(""); tvResult.setText(""); break; case MENU_QUIT_ID: // выход из приложения finish(); break; >return super.onOptionsItemSelected(item); >
Сохраним все, запустим. Появилось два пункта меню:
Reset – очищает все поля
Quit – закрывает приложение
В качестве самостоятельной работы вы можете реализовать проверку деления на ноль. И выводить какое-нить сообщение с помощью Toast или прямо в поле результата.
На следующем уроке:
- рассмотрим анимацию View-компонентов
Присоединяйтесь к нам в Telegram:
- в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
- в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Compose, Kotlin, RxJava, Dagger, Тестирование, Performance
- ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
Как создать приложение Android для простого калькулятора с помощью Android Studio

В моей предыдущей статье я написал подробные инструкции о том, как создать простое приложение для Android . В этом конкретном приложении я также объяснил понятия кнопки Android и основные понятия Android.
Все остальные мои статьи вы можете найти в разделе Android .
В этой статье мы создадим calculator android app , Это простой калькулятор с ограниченными функциональными возможностями.
Прежде чем мы продолжим, было бы неплохо пройти полный курс HelloWorld Tutorial. Вот снова ссылка: Мое первое приложение для Android HelloWorld
- Как создать простое приложение-калькулятор — полное руководство
- Создание простого калькулятора с помощью Android Studio
- Разработка Android: создание базового калькулятора
- Создать простое приложение для Android
- Как создать приложение калькулятор для Android
Давайте начнем с нашего приложения для калькулятора Android:
Шаг 1
- Откройте вашу Android Studio
- Нажмите «Начать новый проект Android Studio».
- Дайте название вашей заявки CrunchifyCalculator и оставьте другие поля пустыми, как есть, затем нажмите NEXT.

Шаг 2
- Выберите минимальный SDK API 15: Android 4.0.3(IceCreamSandwich) , Я выбрал API 15 (IceCreamSandwich), потому что он охватывает почти 94% устройств и обладает практически всеми функциями. Если вы хотите покрыть 100% устройства, вы можете выбрать API 8: Android 2.2 (Froyo).

Шаг 3
- Выберите Empty Activity и нажмите ДАЛЕЕ.
- Оставьте название деятельности MainActivity как есть и оставь все как есть. Нажмите Готово.

Шаг 4
- После нажатия кнопки «Готово» на создание действия и файлов уходит около 2 минут.
- Вот окончательная структура проекта для вашего приложения.

Шаг 5
- Теперь мы должны добавить наш Java-код в наш файл MainActivity.java.
- Так открою тебя MainActivity.java файл с левой стороны IDE (приложение -> java -> com.crunchify.tutorials.crunchifycalculator -> MainActivity.java)
Вы можете найти объяснение выделенной строки под кодом.