Перейти к содержимому

Как сделать калькулятор в андроид студио

  • автор:

#11 — Kotlin Android Studio. Создание калькулятора

#11 - Kotlin Android Studio. Создание калькулятора

Kotlin создавался в первую очередь для разработки Андроид приложений через Android Studio. В уроке вы научитесь создавать программы под Андроид с использованием языка Kotlin для всего функционала в программе.

Видеоурок

Андроид разработка долгие годы велась по большей части на языке Java через программу Android Studio . С приходом языка Kotlin программа Android Studio никуда не делась, а вот доля Android программ что разрабатываются на Java немного уменьшилась.

Язык Котлин предложил легкую и удобную форму написания приложений без использования сложных конструкций кода. Так то не дурно что многие решили перейти на новый и намного более облегченный вариант разработки программ.

Создание программ на Kotlin

Для разработки на Kotlin все что необходимо сделать, так это при создании проекта установить галочку «Include Kotlin support»:

После этого будет создан проект, в котором можно создавать как Java, так и Kotlin файлы. Также в проекте можно подключать библиотеки что могут быть написаны на любом из вышеперечисленных языков программирования.

#3 – Написание кода. Создание калькулятора

#3 – Написание кода. Создание калькулятора

За урок мы рассмотрим множество важных концепций при разработке в Android Studio. Мы познакомимся с состояниями страниц, узнаем как можно писать дизайн и разработаем небольшой калькулятор в Android Studio.

Видеоурок

Жизненный цикл

Ниже вы можете ознакомиться с жизненным циклом любой Activity или любой страницы приложения:

Activity Lifecycle

Разработка проектов

Разработка любого проекта сводиться к двум моментам:

  • разработка дизайна
  • написание кода и функций

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

Простой калькулятор на Android

Здравствуйте. Изучаю разработку под Андроид, пишу банальные задачки (сейчас — калькулятор). И вот собственно встал вопрос — строку с выражением я сформировал, как мне теперь её посчитать? Если бы у меня сложный калькулятор, то использовал бы методы обратной польской записи и другие уже известные алгоритмы. Но у меня +, -, *, /. В скриптовых языках я бы использовал что-то вроде eval(), а вот тут запнулся. Помогите, если сталкивались, пожалуйста 🙂

Отслеживать
задан 9 ноя 2012 в 19:47
andrewshka andrewshka
1,613 2 2 золотых знака 31 31 серебряный знак 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); >> > 

Когда — то давно прогал для собеседования

Как сделать калькулятор в андроид студио

Зная некоторые основы компоновки и такие элементы как TextView, EditText и Button, уже можно составить более менее полноценное приложение. В данном случае мы сделаем простенький калькулятор.

Для этого создадим новый проект и определим в файле activity_main.xml следующий интерфейс:

В итоге весь интерфейс будет выглядеть следующим образом:

Калькулятор на Android и Java

Корневой контейнер компоновки представляет элемент ConstraintLayout . Сверху в нем определены два текстовых поля TextView: одно для вывода результата вычислений и одно для вывода текущего знака операции.

Затем идет элемент EditText, предназначенный для ввода чисел.

И далее расположены четыре элемента LinearLayout с горизонтальными рядами кнопок. Чтобы все кнопки занимали равное пространство внутри контейнера, для них установлены атрибуты android:layout_weight=»1″ и android:layout_width=»0dp» .

Для каждой кнопки установлен идентификатор, чтобы в коде можно было прикрепить к ней определенный обработчик нажатия.

Теперь изменим класс MainActivity :

package com.metanit.calculator; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; 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); findViewById(R.id.add).setOnClickListener((view)->onOperationClick("+")); findViewById(R.id.sub).setOnClickListener((view)->onOperationClick("-")); findViewById(R.id.mul).setOnClickListener((view)->onOperationClick("*")); findViewById(R.id.div).setOnClickListener((view)->onOperationClick("/")); findViewById(R.id.eq).setOnClickListener((view)->onOperationClick("=")); findViewById(R.id.n0).setOnClickListener((view)->onNumberClick("0")); findViewById(R.id.n1).setOnClickListener((view)->onNumberClick("1")); findViewById(R.id.n2).setOnClickListener((view)->onNumberClick("2")); findViewById(R.id.n3).setOnClickListener((view)->onNumberClick("3")); findViewById(R.id.n4).setOnClickListener((view)->onNumberClick("4")); findViewById(R.id.n5).setOnClickListener((view)->onNumberClick("5")); findViewById(R.id.n6).setOnClickListener((view)->onNumberClick("6")); findViewById(R.id.n7).setOnClickListener((view)->onNumberClick("7")); findViewById(R.id.n8).setOnClickListener((view)->onNumberClick("8")); findViewById(R.id.n9).setOnClickListener((view)->onNumberClick("9")); findViewById(R.id.comma).setOnClickListener((view)->onNumberClick(",")); > // сохранение состояния @Override protected void onSaveInstanceState(Bundle outState) < outState.putString("OPERATION", lastOperation); if(operand!=null) outState.putDouble("OPERAND", operand); super.onSaveInstanceState(outState); >// получение ранее сохраненного состояния @Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) < super.onRestoreInstanceState(savedInstanceState); lastOperation = savedInstanceState.getString("OPERATION"); operand= savedInstanceState.getDouble("OPERAND"); resultField.setText(operand.toString()); operationField.setText(lastOperation); >// обработка нажатия на числовую кнопку public void onNumberClick(String number) < numberField.append(number); if(lastOperation.equals("=") && operand!=null)< operand = null; >> // обработка нажатия на кнопку операции public void onOperationClick(String op)< 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);

Далее для каждой кнопки назначаем определенный обработчик нажатия — в зависимости от типа кнопки это либо метод onNumberClick , в который передается нажатое число, либо onOperationClick , в который передается знак операции.

Результат операции будет попадать в переменную operand, которая представляет тип Double, а знак операции — в переменную lastOperation:

Double operand = null; String lastOperation = " brush:java;"> numberField.append(number); if(lastOperation.equals(" равно"), то мы сбрасываем переменную operand.

В методе onOperationClick происходит обработка нажатия на кнопку со знаком операции:

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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *