Как создать простое приложение калькулятора - полное руководство с кодом

  1. Создание проекта
  2. Включить привязку данных в вашем проекте
  3. Разработка макета калькулятора
  4. Понимание виджетов макета
  5. Построение макета калькулятора
  6. Внутренний калькулятор
  7. Обработка нажатий кнопок (цифр)
  8. Обработка нажатий кнопок (операторы)
  9. в заключение

Продолжая традицию Android Authority по созданию простых приложений (см. как создать приложение для галереи изображений и как создать приложение SMS ), мы собираемся создать простое, но функциональное приложение-калькулятор. Если вы новичок в программировании и никогда ранее не создавали приложение, вам следует ознакомиться с нашим предыдущим руководством написание вашего первого приложения для Android , В этом руководстве предполагается, что у вас есть хотя бы некоторый базовый опыт написания приложений для Android.

Как и при разработке любой нетривиальной программы, существует более одного способа сделать это, и если у вас будет десять разных программистов, вы можете получить десять разных способов написания калькулятора (если только они не являются читателями Android Authority * wink * ). Полный источник приложения для калькулятора, написанный ниже: доступно на github для использования, повторного использования и модификации сколько угодно.

Создание проекта

Первое, что нужно сделать, это создать новый проект, нажав «Начать новый проект Android Studio» или «Файл -> Новый -> Новый проект».

Для этого учебного пособия по калькулятору мы выбрали опцию EmptyActivity на экране «Добавить действие на мобильный» и оставили имя «Activity» в качестве основной функции по умолчанию. На этом этапе ваша иерархия макета должна выглядеть как на рисунке ниже. У вас есть MainActivity в вашем пакете проекта и файл activity_main.xml в каталоге макета.

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

Для нашего примера калькулятора мы настроим наш проект на использовать привязку данных , Использование привязки данных в этом приложении просто помогает нам напрямую обращаться к нашим виджетам (Buttons, EditText и TextView), а не находить их с помощью методов findViewById (). Чтобы включить привязку данных, необходимо добавить следующую строку в файл приложения build.gradle.

android {... dataBinding.enabled = true ...

Разработка макета калькулятора

Чтобы включить привязку данных в нашем файле activity_main.xml, необходимо сделать одно последнее изменение. Оберните сгенерированный корневой тег (в нашем случае это был RelativeLayout) внутри тега макета, сделав тег макета новым корневым тегом.

&lt;? xml version = "1.0&quot; encoding = "utf-8"?> <layout> <RelativeLayout> ... </ RelativeLayout> </ layout>

Тег макета предупреждает систему сборки о том, что этот файл макета намеревается использовать привязку данных. Затем система сборки автоматически создает класс Binding для этого файла макета. Поскольку целевой xml-файл называется activity_main.xml, система сборки сгенерирует класс с именем ActivityMainBinding, на который вы можете ссылаться в своем приложении, как на любой другой класс Java. Имя класса генерируется из имени файла макета путем использования заглавных букв первой буквы каждого слова после подчеркивания, удаления всех подчеркиваний и добавления «Привязки» к имени.

На этом этапе переключитесь на свой файл MainActivity.java. Создайте частный экземпляр ActivityMainBinding в своем классе, а в методе onCreate () удалите строку setContentView () и замените ее строкой DataBindingUtil.setContentView () в фрагменте кода ниже.

открытый класс MainActivity расширяет AppCompatActivity {private привязка ActivityMainBinding; @Override protected void onCreate (Bundle saveInstanceState) {super.onCreate (сохраненныйInstanceState); binding = DataBindingUtil.setContentView (this, R.layout.activity_main); }}

Понимание виджетов макета

В нашем приложении калькулятора есть четыре основных пункта. Эти:

  1. RelativeLayout - этот элемент определяет, как остальные элементы располагаются или отображаются на экране. RelativeLayout используется для позиционирования дочерних элементов по отношению друг к другу или к себе.
  2. TextView - этот элемент используется для отображения текста. От пользователей не ожидается взаимодействия с этим элементом. Результат вычислений отображается с помощью TextView.
  3. Редактировать текст - это разновидность TextView, которую пользователи могут редактировать и изменять текст. Однако, поскольку калькулятор допускает только фиксированный набор входных данных, мы устанавливаем текст для редактирования как недоступный для редактирования. Когда пользователь нажимает на цифры, мы отображаем цифры в EditText.
  4. кнопка - этот элемент позволяет взаимодействовать с пользователем и, в идеале, должен реагировать на нажатия пользователем. Мы используем кнопки для цифр и операторов в калькуляторе.

Построение макета калькулятора

Макет калькулятора немного длинный. Это связано с тем, что мы должны четко определить и тщательно позиционировать каждую из кнопок в калькуляторе. Фрагмент ниже представляет собой сокращенную версию файла макета Activity_main

<layout> <RelativeLayout xmlns: android = "http://schemas.android.com/apk/res/android" xmlns: tools = "http://schemas.android.com/tools" android: id = "@ + id / activity_main "android: layout_width =" match_parent "android: layout_height =" match_parent "android: paddingBottom =" @ dimension / activity_vertical_margin "android: paddingLeft =" @ dimension / activity_horizont_margin "android: paddingRight =" @ dimension / activity_horizont_margin and and paddingTop = "@ dimension / activity_vertical_margin" tools: context = "com.sample.foo.samplecalculator.MainActivity"> <TextView android: id = "@ + id / infoTextView" android: layout_width = "match_parent" android: layout_height = "wrap_content "android: layout_marginBottom =" 30dp "android: textSize =" 30sp "/> <EditText android: id =" @ + id / editText "android: layout_width =" match_parent "android: layout_height =" wrap_content "android: layout_below =" @ id / infoTextView "android: enabled =" false "android: gravity =" bottom "android: lines =" 2 "android: maxLines =" 2 "android: textSize =" 20sp "/> <кнопка android: id =" @ + id / buttonSeven "s tyle = "@ style / Widget.AppCompat.Button.Borderless" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_below = "@ id / editText" android: text = "7" android: textSize = " 20sp "/> <Button android: id =" @ + id / buttonEight "style =" @ style / Widget.AppCompat.Button.Borderless "android: layout_width =" wrap_content "android: layout_height =" wrap_content "android: layout_below =" @ id / editText "android: layout_toRightOf =" @ id / buttonSeven "android: text =" 8 "android: textSize =" 20sp "/> <Button android: id =" @ + id / buttonNine "style =" @ style / Widget.AppCompat.Button.Borderless "android: layout_width =" wrap_content "android: layout_height =" wrap_content "android: layout_below =" @ id / editText "android: layout_toRightOf =" @ id / buttonEight "android: text =" 9 "android : textSize = "20sp" /> ... ... <Button android: id = "@ + id / buttonDot" style = "@ style / Widget.AppCompat.Button.Borderless" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_below = "@ id / buttonOne" android: text = "." android: textSize = "20sp" /> <Button android: id = "@ + id / buttonZero" style = "@ style / Widget.AppCompat.Button.Borderless" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignRight = "@ id / buttonEight" android: layout_below = "@ id / buttonTwo" android: text = "0" android: textSize = "20sp" /> <Button android: id = "@ + id / buttonEqual" style = "@ style / Widget.AppCompat.Button.Borderless" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignRight = "@ id / buttonNine" android: layout_below = "@ id / buttonThree" android: text = "=" android: textSize = "20sp" /> <Button android: id = "@ + id / buttonDivide" style = "@ style / Widget.AppCompat.Button.Borderless" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignTop = "@ id / buttonNine" android: layout_toRightOf = "@ id / buttonNine" android: text = "/" android: textSize = "20sp" /> <Кнопка android: id = "@ + id / buttonMultiply "style =" @ style / Widget.AppCompat.Button.Borderless "android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignTop = "@ id / buttonSix" android: layout_toRightOf = "@ id / buttonSix" android: text = "*" android: textSize = "20sp" /> <Кнопка android: id = "@ + id / buttonSubtract" style = "@ style / Widget.AppCompat.Button.Borderless" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignTop = "@ id / buttonThree" android: layout_toRightOf = "@ id / buttonThree" android: text = "-" android: textSize = "20sp" /> <Button android: id = "@ + id / buttonAdd" style = "@ style / Widget.AppCompat.Button.Borderless" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignTop = "@ id / buttonEqual" android: layout_toRightOf = "@ id / buttonEqual" android: text = "+" android: textSize = "20sp" /> <Button android: id = "@ + id / buttonClear" style = "@ style / Widget.AppCompat.Button.Borderless" android: layout_width = "wrap_content" android: layout_height = "wrap_content" android: layout_alignRight = "@ id / buttonAdd "android: layout_below =" @ id / buttonAdd "an droid: layout_marginTop = "@ Dimen / Activity_vertical_margin" android: text = "C" android: textSize = "20sp" /> </ RelativeLayout> </ layout>

Внутренний калькулятор

Наш калькулятор имеет два значения, valueOne и valueTwo. Эти значения содержат числа, с которыми нужно работать. Оба значения имеют тип double, поэтому они могут содержать числа с десятичными знаками и без них. Мы устанавливаем valueOne в специальное значение Double NaN (не число) по причинам, которые будут понятны ниже.

private double valueOne = Double.NaN; private double valueTwo;

Этот простой калькулятор может выполнять только операции сложения, вычитания, умножения или деления. Итак, мы определяем четыре статических символа для представления этих операций и переменную CURRENT_ACTION, которая содержит следующую операцию, которую мы намереваемся выполнить.

приватный статический финал char ADDITION = '+'; private static final char SUBTRACTION = '-'; private static final char MULTIPLICATION = '*'; private static final char DIVISION = '/'; приватный символ CURRENT_ACTION;

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

decimalFormat = new DecimalFormat ("#. ##########");

Обработка нажатий кнопок (цифр)

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

binding.buttonZero.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {binding.editText.setText (binding.editText.getText () + "0");}});

Обработка нажатий кнопок (операторы)

Обработка кликов по операторам немного отличается. Мы хотели бы сначала выполнить любые ожидающие вычисления. Итак, мы определяем метод computeCalculation. В computeCalculation, если valueOne является допустимым числом, мы читаем valueTwo из editText и выполняем текущую операцию с очередями. С другой стороны, если valueOne равен NaN, valueOne назначает номер в editText.

private void computeCalculation () {if (! Double.isNaN (valueOne)) {valueTwo = Double.parseDouble (binding.editText.getText (). toString ()); binding.editText.setText (нуль); if (CURRENT_ACTION == ДОБАВЛЕНИЕ) valueOne = this.valueOne + valueTwo; иначе if (CURRENT_ACTION == SUBTRACTION) valueOne = this.valueOne - valueTwo; иначе if (CURRENT_ACTION == MULTIPLICATION) valueOne = this.valueOne * valueTwo; иначе if (CURRENT_ACTION == DIVISION) valueOne = this.valueOne / valueTwo; } else {try {valueOne = Double.parseDouble (binding.editText.getText (). toString ()); } catch (Exception e) {}}}

Для каждого оператора мы сначала вызываем computeCalculation (), затем устанавливаем CURRENT_ACTION для выбранного оператора, в то время как для оператора equals '=' мы вызываем computeCalculation (), а затем очищаем содержимое обоих valueOne и CURRENT_ACTION.

binding.buttonAdd.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {computeCalculation (); CURRENT_ACTION = ADDITION; binding.infoTextView.setText (decimalFormat.format (valueOne) +) + "+" .editText.setText (null);}}); binding.buttonSubtract.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {computeCalculation (); CURRENT_ACTION = SUBTRACTION; binding.infoTextView.setText (decimalFormat.format (valueOne) +) .editText.setText (null);}}); binding.buttonMultiply.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {computeCalculation (); CURRENT_ACTION = MULTIPLICATION; binding.infoTextView.setText (decimalFormat.format (valueOne)) .editText.setText (null);}}); binding.buttonDivide.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {computeCalculation (); CURRENT_ACTION = DIVISION; binding.infoTextView.setText (decimalFormat.format (valueOne) + "/") .editText.setText (null);}}); binding.buttonEqual.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {computeCalculation (); binding.infoTextView.setText (binding.infoTextView.getText (). toString () + decimalTwo.mat () ) + "=" + decimalFormat.format (valueOne)); valueOne = Double.NaN; CURRENT_ACTION = '0';}});

Поздравляем! Вы завершили свое простое приложение Android для калькулятора.

в заключение

Если вы запустите и используете вышеупомянутое приложение, вы заметите некоторые возможные области улучшений, такие как 1) щелкните оператор, когда текст редактирования свободен (т. Е. Без ввода числа вначале), 2) разрешите пользователю продолжать вычисление после нажатия на равные кнопка.

Как всегда, полный источник доступно на github , и вы свободны (даже не поощряются) изменять и использовать содержимое своего сердца. Привет в комментариях, если вы нашли это полезным, и / или хотите порекомендовать приложение для будущего урока.

Похожие

Как добавить плашечный цвет в Adobe Illustrator
Плашечные краски - это специально смешанные чернила, которые используются в коммерческой печати, когда цветопередача имеет решающее значение. Цвет, который изготавливается из голубого, пурпурного, желтого и черного цветов, может меняться на протяжении всего тиража. Плашечный цвет также используется для металлических или неоновых цветов. В большей части западного мира Pantone® Matching System является отраслевым стандартом. Чтобы добавить плашечный цвет к своим образцам, откройте
Как вернуть меню «Пуск» обратно в Windows 8
... кнопок, которые образуют больше центра управления Windows. Каждая кнопка запускает свою функцию. Например, одна кнопка выключает Windows, другая перезапускает ее, а другая выдает вам знак. Четвертая кнопка касается поиска Windows. Пятый выводит вас на начальный экран. И шестой открывает меню 8Startbutton. Нажатие кнопки для меню 8Startbutton вызывает меню «Пуск» с дисплеем из одного столбца, в котором справа расположены ярлыки для программ, а слева - серия значков. Один
Как восстановить пароль root для VMware ESXi?
Мы не должны терять учетную запись суперпользователя в любой операционной системе, особенно в VMware ESXi. Может быть вероятность потери пароля root из-за неосторожного обращения с системным администратором или неисправной клавиатуры. Если вы забыли пароль root для хоста ESXi, то восстановить его невозможно. VMware не предоставляет утилиту или методы для восстановления исходного пароля root хоста ESX / ESXi. Если вы попытаетесь использовать какой-либо другой метод, это может привести к сбою
Как импортировать Ведьмака 2 Сохранить в Ведьмака 3: Дикая Охота
Сообщалось, что вы можете импортировать Witcher 2 в ваш новая блестящая копия игры Ведьмак 3 только чтобы узнать, что при запуске игры вы видите только опцию «Simulate Witcher 2 Save». Это очень огорчает того, кто, вероятно, потратил много времени на предварительный запуск, чтобы подготовить Геральта к
Руководство по созданию временных логинов на сайте WordPress
Как только вы преодолеете начало кривой обучения WordPress, например, как вести блог
Как заказать цифровую печать на сайте FotoPrint.pl
Моменты, когда вы можете сидеть в кресле с чашкой горячего чая, открыть альбом и вернуться с воспоминаниями о самых радостных моментах в вашей жизни, бесценны. Однако, несмотря на то, что у нас есть тысячи фотографий в памяти наших
Как запускать приложения Firefox OS в вашем браузере Android
Реклама Теперь вы можете установить приложения Firefox OS на Android. Firefox для Android поддерживает Mozilla «Открытые веб-приложения», что позволяет устанавливать и запускать приложения Firefox OS непосредственно на устройстве Android. Firefox Marketplace теперь функционирует как альтернативный магазин приложений для Android, так же как Amazon App Store
Моя собака преследует мою кошку. Как я могу остановить его?
Ниже приведен отрывок из FurKeeps Kickoff от Petfinder.com в режиме реального времени на Facebook. В: У меня есть двухлетний кобель Такса / Мопс, и за последние четыре месяца он решил, что мои четыре кошки идеально подходят для погони. У него есть две другие собаки, с которыми можно играть, он много тренируется и все еще преследует моих кошек. Что мне не хватает? Я знаю, что у докси очень сильная добыча, но почему он начал гоняться за кошками только в последние четыре
Как проверить XML на соответствие XSD в Java
Java XML Validation API может использоваться для проверки XML на соответствие XSD в Java-программе. Класс javax.xml.validation.Validator используется в этой программе для проверки xml на соответствие xsd в java. Вот примеры используемых файлов XSD и XML. Employee.xsd копия
Доктор Ватсон
Обновлено: 20.12.2017 от Computer Hope О докторе Ватсоне Доктор Ватсон является программного обеспечения полезность включены с Microsoft Windows
Скачать песни с YouTube проще, чем когда-либо
Хотите прослушать песню с YouTube в автономном режиме, но не знаете как? Чувствуете, что не можете загружать песни с YouTube без осложнений и хлопот? Ну, эта статья может помочь вам в том, как легко скачать песни с YouTube. От iMobie | Опубликовано: 30 октября 2018, Последнее обновление: 25 апреля 2019 YouTube, как один из самых популярных веб-сайтов в мире, является веб-сайтом для обмена видео, который позволяет нам исследовать разнообразный

Комментарии

Итак, как они работают?
Итак, как они работают? В мире, где Firefox OS была успешной, эта функция была бы потрясающей. Вы получите доступ к магазину приложений, в котором полно удивительных веб-приложений, работающих на разных платформах, и вы сможете получать свои приложения оттуда. Ваши приложения могут затем следовать за вами от платформы к платформе, чтобы вы могли легко перемещаться между Firefox OS и Android - и в идеале другими платформами, такими как iPhone и Windows Phone - без потери ваших приложений.
Как сделать свадьбу CEWE PHOTOBOOK?
Как сделать свадьбу CEWE PHOTOBOOK? Лучший и самый простой способ подготовить CEWE PHOTOBOOK - скачать бесплатное программное обеспечение. CEWE FOTOŚWIAT , Программа проста и интуитивно понятна, однако, если у вас возникнут проблемы с ее обслуживанием, на все наши вопросы ответят Обслуживание клиентов , Приглашаем вас ознакомиться с
Однако как мне сказать, сколько раз ключевое слово должно быть на странице?
Однако как мне сказать, сколько раз ключевое слово должно быть на странице? Вы можете вручную анализировать сайты конкурентов, которые занимают первое место в рейтинге по данной фразе, вы также можете использовать инструмент рекомендаций в системе SeoPilot.pl, который будет делать соответствующие расчеты для позиционера. После начала позиционирования не забывайте систематически дополнять и обновлять информацию на сайте. Таким образом, мы привлекаем робота индексирования, потому что, как известно,
Или, может быть, он начал бы относиться к тем вещам, которые нас так волнуют и на которые у нас нет времени навсегда, как именно?
Или, может быть, он начал бы относиться к тем вещам, которые нас так волнуют и на которые у нас нет времени навсегда, как именно? Час в тот или иной момент вас не спасет. Сядьте перед компьютером и закажите эти фотографии в конце. Закажите фотокнигу окончательно. Захватывайте воспоминания, которые у нас сейчас все меньше и меньше, хотя, как это ни парадоксально, у нас больше возможностей их спасти. А в воскресенье отпусти уборку и все обязанности. Отправляйтесь с семьей на ужин
В 90% случаев лучше следовать правилу трех деления, но как насчет оставшихся 10%?
В 90% случаев лучше следовать правилу трех деления, но как насчет оставшихся 10%? Центральная рамка хорошо работает при фотографировании симметричных объектов. Стабилизирует композицию и подчеркивает то, что мы хотим показать. Примеры фотографий с центральной рамкой: 3. ТОЧКА ЗРЕНИЯ - в последние годы Instagram распространил перспективу «с высоты птичьего полета», «лягушка», к сожалению, все еще хромает. Я не знаю откуда, исходя из убеждения, что картинки всегда делаются
Как к ним подготовиться?
Как к ним подготовиться? Начните с планирования всех блюд, которые мы будем есть в течение следующих семи дней. Затем стоит проверить, не осталось ли у нас дома продуктов, а затем подготовить список поручений. Почему это так важно? С готовым планом в руках вы можете купить все, что вам нужно - не слишком много, но и недостаточно, и вы ничего не забудете. Конечно, если это забудется, это не конец света, потому что вы всегда можете вернуться в магазин, но ... обычно
Хотите прослушать песню с YouTube в автономном режиме, но не знаете как?
Хотите прослушать песню с YouTube в автономном режиме, но не знаете как? Чувствуете, что не можете загружать песни с YouTube без осложнений и хлопот? Ну, эта статья может помочь вам в том, как легко скачать песни с YouTube. От iMobie | Опубликовано: 30 октября 2018, Последнее обновление: 25 апреля 2019 YouTube, как один из самых популярных веб-сайтов в мире, является веб-сайтом для обмена видео, который позволяет нам исследовать разнообразный
Но как насчет фотоаппаратов?
Но как насчет фотоаппаратов? Мир фотографии также движется вперед благодаря цифровым технологиям. - - - - - - - - - - - - - - - - - - РЕКЛАМА - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Не так давно фотографу, который также был энтузиастом горных туров, пришлось выбирать между маленькой и удобной, но в то же время относительно компактной камерой и большой, тяжелой и хлопотной при переносе
Как используется информация обо мне?
Как используется информация обо мне? Когда вы пользуетесь веб-сайтом или интернет-сервисом (например, поиском), заполняете веб-формы или взаимодействуете с другими типами интернет-контента, предоставляемая вами информация о вас может помочь вам выбрать рекламу, которая может вас заинтересовать. Мы можем работать с другими веб-сайтами и рекламными сетями для показа соответствующих объявлений, и наши партнеры могут иметь доступ к некоторой информации, которую
Я предполагаю, что все кошки были резидентами до того, как туда попала ваша собака?
Я предполагаю, что все кошки были резидентами до того, как туда попала ваша собака? Убедитесь, что режим тренировки вашей собаки регулярный и очень утомительный. Упражнения часто могут решить множество проблем сразу! Thinkstock Что касается эпизодов с преследованием, его нужно перенаправить, как только начнется
Вы когда-нибудь хотели проверить HTML, сгенерированный из DOM после того, как JavaScript изменил исходный HTML-источник?
Вы когда-нибудь хотели проверить HTML, сгенерированный из DOM после того, как JavaScript изменил исходный HTML-источник? Если это так, выполните следующие действия. меры Первый, скачать и установить CSS HTML Validator для Windows (пробная версия будет работать) и Браузер Google Chrome для рабочего стола (новое окно) если вы еще этого не сделали Многие уже установили

Lt;?
Quot; encoding = "utf-8"?
Как я могу остановить его?
Что мне не хватает?
Чувствуете, что не можете загружать песни с YouTube без осложнений и хлопот?
Итак, как они работают?
Как сделать свадьбу CEWE PHOTOBOOK?
Как сделать свадьбу CEWE PHOTOBOOK?
Однако как мне сказать, сколько раз ключевое слово должно быть на странице?
Или, может быть, он начал бы относиться к тем вещам, которые нас так волнуют и на которые у нас нет времени навсегда, как именно?