Содержание

Разработка андроид приложения на примере Калькулятора++. От идеи к реализации / Хабр


Идея

Я, как бывший студент, а ныне инженер, часто провожу какие-либо расчёты «на лету»: будь то расчёт стоимости товара за кг, значение эффективного годового процента за кредит или построение графика распределения голосов на выборах.

После нескольких минут поиска в андроид.маркете (который просто пухнет от представленных на нём программ) было установлено с десяток самых популярных калькуляторов. Но радость оказалась не полной… Всё мне не нравилось, всё было не удобно: где дизайн подкачал, где способ ввода, где постоянные падения. Тут и родилась идея: почему бы не написать свой калькулятор, — java я знаю хорошо. Пусть с андроид не работал — но зато опыта наберусь и скилы прокачаю, да и инструмент хороший получу.

Анализ

Более подробно остановлюсь на анализе нескольких приложений на андроид. маркете:

1. RealCalc Scientific Calculator (анроид.маркет)


Первым в списке идёт RealCalc — классический калькулятор с числом установок 5-10 млн. Средняя оценка: 4.7.

Плюсы:

  1. Сайт поддержки хорош — там и help и changes и FAQ
  2. Привычный дизайн (здесь всё сугубо субъективно — мне не нравится)

Очевидные* (* по моему мнению) недочёты:

  1. Невозможность ввода выражений
  2. Убогий дизайн (об этом ещё упомяну в конце главы)
  3. Скудный набор встроенных функций
  4. Невозможность построения графиков
  5. Обязательно использование знака умножения * (вместо 5sin(2PI) нужно писать 5*sin(2*PI))

2. Cube Calculator Free (андроид.маркет)

Число установок: 100-500 тыс. Средняя оценка: 4.8

Плюсы:

  1. Более продуманный дизайн (по сравнению с RealCalc)
  2. Расчёт выражений
  3. История вычислений
  4. Расчёт выражений «на лету» (не нужно нажимать кнопку ‘=’)

Минусы (часть из них один-в-один как и в RealCalc):

  1. Функционал разбит на два экрана и нужно постоянно переключаться между ними
  2. Скудный набор встроенных функций
  3. Невозможность построения графиков
  4. Обязательно использование знака умножения * (вместо 5sin(2PI) нужно писать 5*sin(2*PI))

3.

Handy Calc (андроид.маркет)

Число установок: 0.5 — 1 млн. Средняя оценка: 4.7

Плюсы:

  1. Мощный функционал (построение графиков, решение уравнений и т.д.)
  2. Работа с документами (сохранение, загрузка)

Минусы:

  1. Непонятный интерфейс — 2 экрана, на каждом своя кнопка = (выполняют разные функции)
  2. Для того чтобы попасть на экран дополнительных функций — нужно выполнить 3 действия (вызвать меню приложения, выбрать ‘Tools’, в появившемся меню выбрать ‘Functions’)

Общий итог:
Все рассмотренные выше приложения имеют один существенный недостаток — они имеют

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

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

Разработка

Разработку приложения я начал ещё в июне 2011 в свободное от работы время. В качестве движка вычислений был выбран JSCL; элементы GUI по большей части написаны мною, некоторые позаимствованы с просторов интернета; библиотека для построения графиков — AChartEngine (хотя не идеальна и имеет ряд довольно странных решений). Здесь стоит, наверное, добавить, что хотя я и выбрал стороннюю библиотеку для вычислений, в скором времени мне пришлось её форкать и исправлять баги/дописывать нужный функционал (она, кстати, сейчас доступна у меня на github’е).

В общем, было много фана, получено море опыта, выпита не одна чашка ароматного кофе и проведена не одна ночь перед компьютером.

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

На момент написания статьи общее число собственных java классов в проекте равно 680 (включая внтренние классы), из которых 222 — в основном андроид-модуле (исходники), 276 — в модуле JSCL (исходники), 182 — в общем модуле (исходники).

Релиз

В какой-то момент времени я понял, что приложение уже готово для выпуска в массы. И после тестирования на устройствах коллег и знакомых Калькулятор++ появился в андроид.маркете.
Было это 16 октября.

Что получилось?

Как я писал выше — основной ставкой в Калькуляторе++ (далее К++) был продуманный интерфейс.

Распишу по пунктам какие особенности были добавлены в приложение для достижения данной цели:

  1. Каждая кнопка К++ помимо нажатия ещё умеет обрабатывать так называемый «свайп», т. е. Движение пальца в каком-нибудь направлении от её центра (на данный момент поддерживается свайп вверх и вниз, но уже в следующем релизе добавлю направление вправо). Какие выгоды от такого решения? В первую очередь, благодаря этому удалось на одном экране уместить очень большое число действий — от управления историей (см. клавишу «M») до простого ввода дополнительных функций и операторов (sin(), cos(), %, и т.
    д.). Это сразу же решило проблему нескольких экранов и переключения между ними.
  2. Подсветка синтаксиса — ни в одном из рассмотренных выше калькуляторов не использовался простой способ выделения математических термов — форматирование текста: в К++ каждый уровень вложенности выделяется более тёмным цветом, функция выделяется курсивом, а переменная или константа — жирным.
  3. Автоматическое форматирование чисел: 1 000 000.00 или 1’000’000.00.
  4. Если результат не помещается в окно вывода, то его размер автоматически уменьшается до подходящего (fit screen, проще говоря).
  5. Для частых операций работы с буфером (копировать/вставить) выделены отдельные клавиши.
  6. Окно вывода результатов обладает дополнительным функционалом — если при вычислении произошла ошибка, то по нажатию на него, всплывёт окно с информацией об ошибке; если результат — функция одной переменной — то всплывёт меню с выбором дополнительных действий: построить график/скопировать; в других случаях результат будет просто скопирован в буфер.
  7. Простая и в то же время редко используемая вещь — произведение вычислений без нажатия кнопки =.
  8. При вводе функции — позиционирование курсора внутрь скобок.
  9. Поддержка ландшафтного и портретного режимов.

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

В добавок к интерфейсу, Калькулятор++ имеет ряд функциональных преимуществ:

  1. Огромное число функций (тригонометрический, гиперболические, функции сравнения, и т. д.).
  2. Символьное интегрирование (∫), дифференцирование (∂), суммирование (Σ), произведение (∏).
  3. Построение графиков.
  4. Вычисления в пространстве комплексных чисел.
  5. Возможность сохранения собственных переменных (увы, до функций ещё не добрался).
  6. Возможность «опускания» знака умножить.
  7. Вычисления с процентами.
  8. Вычисления в различных системах счисления и различных угловых единицах (градусы, радианы).
Продвижение

Сегодня не достаточно просто иметь хорошее приложение. Поэтому я потратил некоторое время на его продвижение.
Далее представлены ключевые моменты в продвижении К++:

  1. Выкладка приложения на 4pda (помимо простого увеличения числа установок я получил бесценный фидбек от пользователей этого славного ресурса, за что им, кстати, спасибо).
  2. Обзор приложения в droider чарте. Опять же, спасибо создателям сего чудного обзора. За КОШ отдельный респект =) .
  3. Перевод на иностранные языки: изначально приложение поддерживало только английский и русский языки интерфейса, но благодаря добровольным стараниям Gabriele Ravanetti и Jordi Luna добавились, соответственно, итальянский и испанский. Большое спасибо им за это!
  4. Темы на других форумах, посвящённых андроид устройствам + reddit. com.

График установок приложения:

где

  1. Выкладка приложения на 4pda
  2. Droider обзор
  3. Перевод приложения на итальянский

Примечание: испанский язык появится только со следующей версии.

В этой главе также отмечу своё удивление тому, что для каждой страны продвигать приложение придётся отдельно (для меня было открытием то, что приехав в Европу и зайдя в андроид.маркет с местного компьютера, я не нашёл Калькулятор++ даже в первых 500 новых приложений). Конечно это хорошо для сильно локализованных приложений (расписания, переводчики и т. д.), но для приложений общего назначений — некий барьер.

Что дальше?

А дальше только одно — продолжение разработки; улучшение и допиливание приложения, вылизывание его кода для еще более удобной работы конечного пользователя.
Считаю, что Калькулятор++ — достойный конкурент на рынке калькуляторов в андроид.маркете, и нисколько не жалею о начале его разработки.

С вопросами, замечаниями, пожеланиями — связанными и не связанными с К++ — обращайтесь в личку или на почту, пишите комментарии. Обязательно отвечу =)

Спасибо за внимание!

Ссылки:

  1. Калькулятор++ на андроид.маркете
  2. Исходный код на github

UPD Спасибо всем за замечания, ошибки, пожелания и комментарии.
UPD 2 По просьбе читателей добавил QR-code
UPD 3 На github’е есть небольшой issue tracker. Если не сложно, вводите туда баги, желаемые фичи и т.д., там будет проще мне с вами связаться + ни один запрос не будет пропущен.

Простой калькулятор | F-Droid — Free and Open Source Android App Repository

Новое в версии 5.11.2

* Added some UI, translation and stability improvements

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

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

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

В настройках есть возможность предотвратить засыпание телефона во время работы с приложением для комфортного использования.

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

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

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

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

Особенности:
— Простой в использовании калькулятор.
— История операций.
— Поставляется с темной темой для плавного использования калькулятора.
— Работает как конвертер валют, чтобы помочь вам рассчитать ваши доходы и другие суммы.
— Настраиваемый цвет текста, чтобы он выглядел более круто и в соответствии с вашими потребностями.
— Размер кнопок соответствует размеру среднего пальца, касающегося экрана, что делает вычисления более удобными.

Ознакомьтесь с полным набором простых инструментов здесь:
https://www.simplemobiletools.com

Facebook:
https://www.facebook.com/simplemobiletools

Reddit:
https://www.reddit.com/r/SimpleMobileTools

Telegram:
https://t.me/SimpleMobileTools

Как создать простое приложение-калькулятор с помощью Android Studio?

xml version = "1. 0" encoding = "utf-8" ?>

< androidx.constraintlayout.widget.ConstraintLayout

     xmlns: android = "http://schemas.android.com/apk/res/android"

XMLNS: App = "http://schemas.android.com/apk/res-auto"

xmlns: Tools = "HTTP:////TTP://///тере .android.com/tools"

     android:layout_width = "match_parent"

     android:layout_height = "match_parent"

     android:background = "#8bc34a"

Android: Fostertint = "@Android: Color/Darker_gray"

Инструменты: контекст 9000 ". >

< TextView

Android: Mayout_Width = "14dp"

         android:layout_height = "43dp"

         android:layout_marginStart = "114dp"

         android:layout_marginLeft = "114dp"

         android:layout_marginTop = "58dp"

         0008 = "103dp"

Android: Layout_marginright = "103DP"

Android: Layout_Marginbott 9008 = . scrollbarSize = "30dp"

         android:text = "Калькулятор" 9 0  

50008 Android: TextApeArance = "@Style/TextApeArance.AppCompat.Body1"

Android: Textsize = "30DP"

7 ". "Родитель"

Приложение: Mayout_constraintend_toendof = "родитель"

App: layout_constaintart_tostartof

0008 = "parent"

         app:layout_constraintTop_toTopOf = "parent" />

 

    

     < EditText

         android:id = "@+id/num1"

         android:layout_width = "39040dp"

Android: Layout_height = "28dp"

Android: Layout_Marginstart = "72DP" 9008 7. 70077.70677.70677.708.707.707.707.707.707.707.707.707.707.707.707.707.707.707.7077.7068 7.7068 7.707.7077.7077.707.707.707.707.707.707.7077.707.707.707.

         android:layout_marginEnd = "71dp"

        90layout_Bottomoutmargin 90layout_Bottommargin 90layout_Bottommargin 90layout_margin 0008 = "416dp"

         android:background = "@android:color/white"

         android:ems = "10"

Android: Onclick = "clearTextNum1"

Android: Intoptype = "

"

"Приложение 0007: Layout_constaintbottom_tobottomof = "родитель"

Приложение: Layout_constaintend_toendof = "Парт"

". app:layout_constraintTop_toTopOf = "родительский" />

 

    

< EditText

Android: ID = "@+ID/Num2"

Android: Layout_WIDTH 9 9 9 9 9 9 9 9 9 9 9 9 9 .

Android: Mayout_height = "30DP"

Android: Layout_marginstart = "72DP" 9 = "72DP"0025

Android: Layout_margintop = "112DP"

Android: Layout_Marginend = . . . . . . . . . . . . . . . . . . . . . . .. .. . . . . . . . . . . . . . . . . . . . .

         android:background = "@android:color/white"

        ems 08 android:

08

= "10"

         android:onClick = "clearTextNum2"

         android:inputType = "number"

         app: layout_constraintBottom_toBottomOf = "родительский"

         0006          app:layout_constraintStart_toStartOf = "parent"

         app:layout_constraintTop_toTopOf = "parent" />

 

    

     < TextView

         android:id = "@+id/result"

         Android: Layout_width = "356DP"

Android: Layout_height = и LAUDPARTIRGIRGIRGIRIATERIRING18 9000. 9000.9000.9000. 898.9000 9000. .9000 9000. .1008.9000. 8.9000. 9000. и 1,00078 8.9000. 9000. и LAUDP. Android: Mayout_margintop = "151DP"

Android: Layout_marginend = "48DP"0008

         android:layout_marginBottom = "287dp"

         android:background = "@android:color/white"

         android:text = "Результат"

Android: TextColorlink = "#673AB7"

Android: Textsize

: Textsize 0008 = "25sp"

         app:layout_constraintBottom_toBottomOf = "parent"

         app:layout_constraintEnd_toEndOf = "parent"

         app: layout_constraintStart_toStartOf = "родительский"

         app:layout_constraintTop_toTopOf = "parent" />

 

    

     < Button

         android:id = "@+id/sum"

         Android: Mayout_width = "wrap_content"

Android: Layout_height = "0008 Android: Mayout_marginstart = "16DP"

Android: Layout_Margintop = "292DP"

и рентоид.          android:layout_marginBottom = "263dp"

         android:backgroundTint

8

80007 "@android:color/holo_red_light"

         android:onClick = "doSum"

         android:text = "+"

         app : layout_constraintbottom_tobottomof = "родитель"

App: Layout_constraintend_toendof = "Родитель"

7 = "

7 .0008 app:layout_constraintStart_toStartOf = "parent"

         app:layout_constraintTop_toTopOf = "parent" />

 

    

 

    

 

     < Кнопка

         android:id = "@+id/sub"

Android: Layout_width = "RAW_CONTENT"

Android: Layout_Height = "RAW_CONTEN "

         android:layout_marginTop = "292dp"

:        

8 android En0008

= "113DP"

Android: Layout_marginbottom = "263dp"

Android: Fostertint 70007 "@Holderid ". Android: Onclick = "Dosub"

Android: текст = "-"

= "-"

0008 Приложение: Mayout_constraintbottom_tobottomof = "родитель"

App: Layout_constraintend_toendof = "

.          приложение:layout_constraintStart_toStartOf = "родительский"

         приложение:layout_

7 app:layout_

70008 = "parent"

         app:layout_constraintVertical_bias = "0. 507" />

 

     < Button

         android:id = "@+id/div"

Android: Layout_width = "WRAP_CONTENT"

Android: Mayout_height = "raw_content"

Android: Layout_marginstart = и рентабельность 9000.9000 9000.9000. 9000.9000. 9000.9000. 9000.9000. 9000.9000. 9000.9000. 9000.9000. 9000.9000. 9000.9000.9000.9008 .198.198.198.198.198.1986798989898968 . . . . . . . . . . . . . . . . . .          android:layout_marginEnd = "16dp"

         android:layout_marginBottom

8

80008 "263dp"

Android: Founaltint = "@Android: Color/Holo_red_light"

Android: ONCLICK 9000 9000 9000 000 9000 000 9000 ,000,9000 9000 9000 9000 9000 9000 9000 9000 8 8 9000 , , "DODIV" DODIV. Android: Текст = "/"

Приложение: Layout_constraintbottom_tobottomof = "Родитель"

0008 Приложение: Mayout_constraintend_toendof = "родитель"

Приложение: Layout_constrainthorizontal_bias = "0,0"

.          app:layout_constraintTop_toTopOf = "родительский" />

 

 0008

< Кнопка

Android: ID = "@+ID/MUL"

Android: Layout_WIDTH = "" "".

Android: Mayout_height = "wrap_content"

Android: Layout_marginstart = "16DP"

         android:layout_marginTop = "356dp"

         android:layout_marginEnd = "307dp"

         android:layout_marginBottom = "199dp "

         android:backgroundTint = "@android:color/holo_red_light"

        android:onClick = "doMul"

         android:text = "x"

         app:layout_constraintBottom_toBottomOf = "parent"

         app:layout_constraintEnd_toEndOf = "родительский"

        

7 app:layout_constraintStart8

0080008 "parent"

         app:layout_constraintTop_toTopOf = "parent" />

 

    

 

    

 

     < Button

         android:id = "@+id/кнопка"

         android:layout_width0008 = "103DP"

Android: Layout_height = "46DP"

Android: Layout_Marginstart 9008 " Layout_margintop = "356DP"

Android: Layout_Marginend = "206DP"

9000 "206DP"

"206DP"0008 Android: Layout_marginbottom = "199DP"

Android: Fostertint = "@Android: Color/Holo_red_light"

" " @Android: Color/Holo_Red_Ride_light. Domod "

Android: Текст = "%(MOD) "

APP: LAYOUT_CONSTRAINTBOTTOM_TOBOTTOMOF = "Родитель"

Приложение: Layout_constraintend_toendof = "родитель"

". = "родительский"

         app:layout_constraintVertical_bias = "0,515" />

< Кнопка

Android: ID = "@+ID /Pow"

7 и LAYOUT. "wrap_content"

Android: Layout_height = "raw_content"

Android: Layout_marginstart

0008 = "113dp"

Android: Layout_margintop = "292DP"

Android: Layout_Marginend = : Android: Layout_Marginend 9008 = . layout_marginBottom = "263dp"

         android:backgroundTint = "@android:color/holored9_n2"

         app:layout_constraintBottom_toBottomOf = "parent"

         app:layout_constraintEnd_toEndOf = "parent"

         app:layout_constraintHorizontal_bias = "0. 0"

         app:layout_constraintStart_toStartOf = "родительский"

App: Mayout_constrainttop_totopof = "Parent"

App: Layout_constraintvertical_bias = "0,507" 7575.9008. widget.ConstraintLayout >

Создание простого калькулятора в Kotlin с помощью Android Studio | Тану Н Прабху

В этом уроке мы научимся создавать простой калькулятор на Kotlin с помощью Android Studio.

Кредиты: Digitstory

Описание

В этом уроке мы разработаем калькулятор « 10-key » на Android Studio с использованием Kotlin. Включенные кнопки должны быть:

  • Цифровые клавиши: « 1 », « 2 », « 3 », « 4 », « 5 », «1 1 8», 7 », « 8 », « 9 », « 0 ».
  • Операционные клавиши: « + », « - », « * », « / »
  • Другие клавиши: « = », « ОЧИСТИТЬ». Здесь клавиша « CLEAR » должна очистить экран и все содержимое памяти. Ключ « = » должен применить операцию и выдать результат.
  • Дополнительно калькулятор будет иметь клавишу « DEL », которая аналогична «возврату» и удаляет последний символ на экране.
  • А " . ” должен показывать десятичную дробь.

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

Шаг 1. Создайте «пустое действие» в Android Studio.

Давайте создадим новый проект. Поскольку наш калькулятор содержит только одно действие (нам нужен только один файл действия Kotlin и один файл макета XML), нам нужно выбрать « пустое действие ». Это можно сделать, как показано ниже:

Новый → Новый проект → Пустая активность

Создание пустой активности в студии Android

После создания пустой активности настройте свои проекты, такие как имя, имя пакета, местоположение, язык и Уровень API. Следуйте приведенному ниже снимку экрана, чтобы настроить проект для согласованности. Убедитесь, что вы выбрали язык Kotlin (очевидно, я пишу код на Kotlin). Затем нажмите «Готово», после чего ваш проект будет загружен.

Настройка вашего проекта

Чтобы узнать больше об уровне API, вы можете обратиться к официальной документации Google, приведенной ниже. Не обязательно выбирать API 15, как показано на снимке экрана выше. Просто выберите его для согласованности ради учебника.

Кодовые имена, теги и номера сборки | Android Open Source Project

Разрабатываемые выпуски Android организованы в семейства с алфавитными кодовыми именами, вдохновленными вкусными угощениями…

source. android.com

Шаг 2: Добавление цветов в файл colors.xml

Как следует из названия файлов цветов, мы можем указать цвета для всех кнопок калькулятора. Файл colors.xml можно найти в:

app →res →values ​​→colors.xml

    xml version="1.0" encoding="utf-8"   ?> 
< ресурсы >
< color name="colorPrimary" >#000000 color
> 91
13 color name = "white" >#ffffff color >
< color name="colorPrimaryDark" >#cccccc color >
< color name="colorAccent" >#FF4081< / color >
< color name = "actionButton" >#808080 color >
< color name = "equalButton" >#FF0000 color > color name=" номерActionButton" >#000000 color >
< color name = "numberActionButton2" >#373737 color >
resources >

Шаг 3: Изменение файла styles.

xml

Файл стиля используется для определения формат или внешний вид пользовательского интерфейса. Стиль можно применить к отдельному View (из файла макета) или ко всему Activity или приложению (из файла манифеста).

Файл styles.xml можно найти в

app →res →values ​​→styles.xml

 <  ресурсы  > 


< style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar" >

< item name="colorPrimary" >@color/colorPrimary item >
< item name="colorPrimaryDark" >@color/colorPrimaryDark item >
< item name="colorAccent" >@color/colorAccent item >
стиль >


< style name="ActionButtonStyle" >
< item name="android:layout_width" >0dp item >
< item name="android:layout_height" >match_parent / пункт >
< item name="android:layout_weight" >1 item >
< item name="android:background" >@color/actionButton item >
< item name = "android: textSize" >21sp item >
< item name="android:textColor" >@android:color/white item >
< item name="android:gravity" >center элемент >
< элемент имя="android:layout_margin" >0. 5dp item >

стиль >


< style name="NumberButtonStyle" >
< item name="android:layout_width" >0dp item >
< item name="android:layout_height" >match_parent< / элемент >
< элемент name="android:layout_weight" >1 item >
< item name="android:background" >@color/numberActionButton item >
< item name = "android:textSize" >21sp item >

3 < 8 item name="android:textColor" >@android:color/white item >
< item name="android:gravity" >center item >
< item name="android :layout_margin" >0.5dp пункт >
стиль >
< style name="EqualButtonStyle" >
< item name="android:layout_width" >0dp item >
< item name="android:layout_height" >match_parent / item >
< item name="android:layout_weight" >1 item >
< item name="android:background" >@color/equalButton item >
< item name = "android:textSize" >21sp item >
< item name="android:textColor" >@android:color/white item >
< item name="android:gravity" >center item >
< item name="android:layout_margin" >0.5dp item >
style >

91

< style name="NumberActionButton2" >
< item name="android:layout_width" >0dp item >
< item name="android:layout_height" >match_parent item >
< item name="android:layout_weight" >1 item >
< item name="android:background" >@color/numberActionButton2 item >
< item name ="андроид:размертекста" >21sp item >
< item name="android:textColor" >@android:color/white item >
< item name="android:gravity" >center item >
< item name="android:layout_margin" >0. 5dp item >
style >

resources Все свойства только выше style > 5

5 0 для калькулятора, определенного в файле styles.xml. Краткий обзор 

ActionButtonStyle: Keys → CLEAR, /

NumberButtonStyle: Keys → 1, 2, 3, 4, 5, 6, 7, 8, 9, 0

NumberAction: Key +

EqualButtonStyle: Key → =

Шаг 4: Настройка файла «activity_main.xml»

Это основной файл макета, здесь вам не нужно использовать редактор пользовательского интерфейса, скорее вы можете кодировать весь макет, используя XML. Здесь мы можем использовать макет текстового представления, а не кнопки для клавиш. Я помещаю все текстовое представление в линейный макет. Это механический процесс из-за нескольких текстовых представлений. Так что просто следуй за мной прямо сейчас.

    xml version="1. 0" encoding="utf-8"   ?> 
< LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app= "http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent "
tools:context=".MainActivity"
android:background="@android:color/black"
android:orientation="vertical"
>

< TextView
android:id="@+id/tvExpression"
android:layout_width="match_parent"
android:layout_height="80dp"
android:textColor="@color/actionButton"
android:layout_gravity= «конец»
android:ellipsize="start"
android:singleLine="true"
android:textSize="40sp"
/>

< TextView
android:id="@+id/tvResult"
android: layout_width="match_parent"
android:layout_height="100dp"
android:textColor="@color/white"
android:layout_gravity="end"
android:ellipsize="end"
android:singleLine="true"
android:textSize="30sp"
/>

< LinearLayout
android:layout_width="match_parent"
android :layout_height="match_parent"
android:orientation="vertical"
>

< LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation= "горизонтальный"
>
< TextView
android:id="@+id/tvClear"
style="@style/ActionButtonStyle"
android:text="CLEAR"
/>

< TextView
android:id="@+id /tvDivide"
style="@style/ActionButtonStyle"
android:text="/"
/>

LinearLayout >

< LinearLayout
android:layout_width="match_parent"
android:layout_height="android:layout_height=" 0dp"
андроид:layout_weight="1"
андроид:ориентация="горизонтальный"
>

< TextView
android:id="@+id/tvSeven"
style="@style/NumberButtonStyle"
android:text="7"
/>

< TextView
android:id=" @+id/tvEight"
style="@style/NumberButtonStyle"
android:text="8"
/>

< TextView
android:id="@+id/tvNine"
style="@style/ NumberButtonStyle"
android:text="9"
/>

< TextView
android:id="@+id/tvMul"
style="@style/NumberActionButton2"
android:text="*"
/>

LinearLayout >

< LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_weight="1" :orientation="horizontal"
>

< TextView
android:id="@+id/tvFour"
style="@style/NumberButtonStyle"
android:text="4"
/>

< TextView
android:id="@+id/tvFive"
style="@style/NumberButtonStyle"
android:text="5"
/>

< TextView
android:id="@+id/tvSix"
style="@style/NumberButtonStyle"
android:text="6"
/>

< TextView
android:id="@+id/tvMinus"
style="@style/NumberActionButton2"
android:text="-"
/>

LinearLayout >

< LinearLayout
android :layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
>

< TextView
android:id="@+id/tvOne"
style="@style/NumberButtonStyle"
android:text="1"
/>

< TextView
android:id="@+id/tvTwo"
style="@style/NumberButtonStyle"
android:text="2"
/>

< TextView
android:id="@+id/tvThree "
style="@style/NumberButtonStyle"
android:text="3"
/>

< TextView
android:id="@+id/tvPlus"
style="@style/NumberActionButton2"
android:text="+"
/>

LinearLayout >

< LinearLayout
android:layout_width="match_parent"
android:layout_height9="090p8" android:layout_weight="1"
android:orientation="horizontal"
>

< TextView
android:id="@+id/tvDot"
style="@style/NumberButtonStyle"
android:text=". "
/>

< TextView
android:id="@+id/tvZero"
style="@style/NumberButtonStyle"
android:text="0"
/>

< TextView
android:id="@+id/tvBack"
style="@style/NumberButtonStyle"
android:text ="DEL"
/>

< TextView
android:id="@+id/tvEquals"
style="@style/EqualButtonStyle"
android:text="="
/>

LinearLayout >

LinearLayout >

LinearLayout >

Шаг 5: Размещение библиотеки построителя выражений внутри Gradle.

Я использовал библиотеку Expression Builder для вычисления выражений. С помощью репозитория GitHub я научился это делать. Я изо всех сил пытался использовать кнопку равенства для создания результата. Итак, теперь просто поместите библиотеку построителя выражений внутрь Gradle.

приложение → Gradle Scripts → build.gradle

Просто вставьте → compile ‘net. objecthunter:exp4j:0.4.8’ внутри build.gradle

Шаг 6: Фактический код Kotlin для калькулятора

Во-первых, я добавляю 1, 2, 3,…..0, когда пользователи нажимают клавиши в текстовом представлении соответственно. Для этого я создал функцию с именем AssessmentExpression() , которая выполняет добавление к текстовому представлению. Затем в функции Equals я использую библиотеку Expression Builder и вызываю ее метод Expression Builder для выполнения вычислений. Код в значительной степени говорит сам за себя. Файл main_activity.kt можно найти в:

app → java →com.example.myapplicationcalculator →MainActivity.kt

В моем случае имя пакета com.example.myapplicationcalculator , в вашем случае оно может отличаться.

   // Программа: main_activity.kt 
// Автор: Тану. Н. Прабху
// Курс: CS 855
// Дата: 28.010.2019
// Задание 2
/* Описание: Эта программа помогает выполнять операции и расчеты
базового калькулятора*/
//--------------------------------------------------------------- -------------------
пакет com. example.finalcalculator
импорт androidx.appcompat.app.AppCompatActivity
импорт android.os.Bundle
импорт kotlinx.android.synthetic.main.activity_main.*
импорт net.objecthunter.exp4j.ExpressionBuilder

класс MainActivity : AppCompatActivity()
{

override1814 Oncreate (SavedInstanceState: Bundle?)
{
Super . Oncreate (SavedInstanceState)
SetContentView (R. Mayout . Activity_main_main )

9 9014. setOnClickListener {
AssessmentExpression( "1" , clear = true )
}

tvTwo. setOnClickListener {
оценкаExpression( "2" , ясно = true )
}

tvThree. setOnClickListener {
AssessmentExpression( "3" , clear = true )
} tvFour. setOnClickListener {
AssessmentExpression( "4" , clear = true )
}

tvFive. setOnClickListener {
AssessmentExpression( "5" , ясно = true )
}

tvШесть. setOnClickListener {
AssessmentExpression( "6" , clear = true )
}

tvSeven. setOnClickListener {
AssessmentExpression( "7" , clear = true )
}

tvEight. setOnClickListener {
AssessmentExpression ( "8" , ясно = true )
}

твдевять. setOnClickListener {
AssessmentExpression( "9" , clear = true )
}

tvZero. setOnClickListener {
AssessmentExpression( "0" , clear = true )
}

/*операторы 9154 01904/ setOnClickListener {
AssessmentExpression( "+" , ясно = true )
}

tvМинус. setOnClickListener {
AssessmentExpression( "-" , clear = true )
}

tvMul. setOnClickListener {
AssessmentExpression( "*" , clear = true )
}

tvDivide. setOnClickListener {
AssessmentExpression( "/" , ясно = true )
}

твточка. setOnClickListener {
AssessmentExpression( ". " , clear = true )
}

tvClear. setOnClickListener {
tvExpression. текст = ""
tvResult.text = ""
}

tvEquals. setOnClickListener {
val
текст = tvExpression. текст .toString()
val
выражение = ExpressionBuilder(текст).build()

val result = expression.evaluate()
val longResult = result.toLong()
if (result == longResult.toDouble()) {
tvResult.text = longResult.toString()
} еще {
tvResult.text = result.toString()
}
}

tvBack. setOnClickListener {
val
текст = tvExpression. текст .toString()
если (text.isNotEmpty()) {
tvExpression. Текст = text.drop (1)
}

tvresult.text = ""
}
}

/*Функция для вычисления выражений с использованием выражения. оценитьвыражение(строка: строка, очистить: логическое значение) {
if (очистить) {
Result.text = ""
Expression.append(string)
} else {
Expression.append(Result.text)
Выражение.append(строка)
Result.text = ""
}
}
}

Шаг 7: Запустите приложение с помощью эмулятора

Это последний шаг, теперь, когда вы написали весь код Kotlin, файл XML теперь давайте протестируем результат. Для этого мы можем использовать встроенный эмулятор андроида. Нажмите зеленую кнопку, которая выглядит как кнопка воспроизведения в правом верхнем углу, или просто нажмите Shift + F10. Если вы не знаете, как настроить и использовать встроенный эмулятор Android. Пожалуйста, посмотрите видео ниже:

Кредиты: Влад Войтенко

В качестве альтернативы, если у вас возникли проблемы с использованием эмулятора или если ваш ноутбук сильно нагревается. Не волнуйтесь, всегда есть второй вариант. Используйте Genymotion в качестве внешнего эмулятора. Вы можете посмотреть видео, как настроить Genymotion ниже:

Кредиты: Apk Heaven

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

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

Взаимодействие с пользователем

Для работы этого приложения для Android требуется взаимодействие с пользователем. Пользователь взаимодействует с приложением, выполняя элементарную задачу нажатия кнопок на клавиатуре калькулятора. Вводя числа, пользователь может выполнять основные математические операции, такие как сложение, вычитание, умножение и деление. Использование этого калькулятора тривиально; пользователю нужно только ввести входные данные в калькулятор с помощью клавиатуры, а затем указать, какие операции он хочет выполнить, щелкнув одну из четырех кнопок операций (+, -, *, /). Этот калькулятор может распознавать как положительные, так и отрицательные числа. Кроме того, он распознает порядок операций; набор правил, показывающих, какие операции следует выполнить в первую очередь для оценки выражения. Часто правила обозначаются как PEMDAS, где P-круглые скобки, E-степень, M-умножение, D-деление, A-сложение и S-вычитание. Например, если пользователь вводит 2+9*5, то калькулятор предлагает результат как 47, а не 55. Этот калькулятор не поддерживает круглые скобки и экспоненты, поэтому порядок операций в соответствии с PEMDAS в этом случае следующий: «*», т. е. 9*5, за которым следует «+», т. е. 45+2 и результат 47.

В приведенной выше таблице 1 показаны кнопки и функции основного калькулятора. Эти операции напоминают обычный калькулятор, который всем известен в наши дни. Например, этот калькулятор отображает на экране до 18 символов (1/3 = 0,3333333333333333). Этот калькулятор имеет хороший пользовательский интерфейс и дизайн, он выглядит и немного похож на продвинутые калькуляторы, которые мы часто используем в наших телефонах Android. На самом деле, я намеревался разработать его на основе моего нынешнего Android-смартфона.

Известные проблемы и ограничения

При использовании этого калькулятора мы не можем использовать сочетания клавиш для ввода данных. Мы можем использовать только кнопки, предусмотренные в самом калькуляторе, для ввода входных данных. Это не большая проблема, потому что это приложение для Android. Каждый запускает это приложение на своем смартфоне, вам не нужна клавиатура для ввода цифр.

Кроме того, этот калькулятор не выдает никаких сообщений об ошибках, если кто-то пытается разделить на 0. Если кто-то вводит две операции одновременно, калькулятор не выводит никаких сообщений об ошибках. Например, введя выражение 5**+9, калькулятор не зависает и не аварийно завершает работу, а ожидает, пока пользователь изменит операции и превратит его в допустимое математическое выражение.

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

Следовательно, мы сознательно или неосознанно создали красивый простой калькулятор, используя Kotlin в Android Studio. Это всего лишь простой калькулятор, мы можем добавить еще несколько функций, а также построить научный. Но этого более чем достаточно для хорошего начала, чтобы освоить Kotlin и Android Studio Coding. Я бы порекомендовал вам, ребята, набирать код, а не копировать-вставлять, иногда при копировании-вставке вы получаете ошибки из-за несоответствия пакетов. У всех разные пакеты в студии Android, так что печатайте и учитесь. Если у вас, ребята, есть какие-либо сомнения относительно этого урока, напишите ответ или комментарий ниже.

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

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