Продолжая традицию Android Authority по созданию простых приложений (см. приложение галереи изображений и как создать приложение для SMS), мы собираемся создать простое, но функциональное приложение-калькулятор. Если вы новичок в программировании и никогда раньше не создавали приложения, вам следует ознакомиться с нашим предыдущим руководством по написанию своего первого приложения для Android. В этом руководстве предполагается, что у вас есть хотя бы некоторый базовый опыт написания приложений для Android.
Как и при разработке любой нетривиальной программы, есть несколько способов сделать это, и если вы получите десять разных программисты, вы можете получить десять различных способов написания калькулятора (если только они не являются читателями Android Authority * подмигивают *). Полный исходный код для приложения-калькулятора, описанный ниже, доступен на github для использования, повторного использования и модификации сколько угодно.
Создание проекта
Первое, что нужно сделать do — это создать новый проект, нажав «Начать новый проект Android Studio» или «Файл -> Новый -> Новый проект».
Для этого урока по калькулятору мы выбрали опцию EmptyActivity на экране« Добавить действие на мобильный »и оставили имя действия как MainActivity по умолчанию. . На этом этапе ваша иерархия макета должна выглядеть, как показано на рисунке ниже. У вас есть MainActivity в вашем пакете проекта и файл activity_main.xml в каталоге макета.
Включить привязку данных в вашем проекте
Для нашего примера калькулятора мы настроим наш проект на использование привязки данных. Использование привязки данных в этом приложении просто помогает нам напрямую обращаться к нашим виджетам (Buttons, EditText и TextView), а не находить их с помощью методов findViewById (). Чтобы включить привязку данных, необходимо добавить в файл приложения build.gradle следующую строку.
android {... dataBinding.enabled = true ...
Разработка макета калькулятора
Чтобы включить привязку данных в нашем activity_main Файл .xml требует последнего изменения. Оберните сгенерированный корневой тег (в нашем случае это был RelativeLayout) в тег макета, сделав тег макета новым корневым тегом.
Xml version = "1.0" encoding = "utf- 8 "?> ...
Тег макета — это то, что предупреждает систему сборки о том, что этот файл макета намеревается использовать привязку данных. Затем система сборки автоматически генерирует класс привязки для этого файла макета. Поскольку целевой XML-файл называется activity_main.xml, система сборки сгенерирует класс с именем ActivityMainBinding, на который вы можете ссылаться в своем приложении, как и на любой другой класс Java.. Имя класса создается из имени файла макета путем использования заглавной буквы каждого слова после подчеркивания, удаления всех подчеркиваний и добавления «Привязки» к имени.
На этом этапе переключитесь на ваш файл MainActivity.java. Создайте частный экземпляр ActivityMainBinding в своем классе, а в методе onCreate () удалите строку setContentView () и замените ее строкой DataBindingUtil.setContentView () в фрагменте кода ниже.
public class MainActivity расширяет привязку AppCompatActivity {private ActivityMainBinding; @Override protected void onCreate (Bundle savedInstanceState) {super.onCreate (savedInstanceState); привязка = DataBindingUtil.setContentView (это, R.layout.activity_main); }}
Общие сведения о виджетах макета
В нашем приложении-калькуляторе есть четыре основных элемента. Это:
- RelativeLayout — этот элемент управляет расположением или отображением других элементов на экране. RelativeLayout используется для позиционирования дочерних элементов относительно друг друга или самого себя.
- TextView — этот элемент используется для отображения текста. Ожидается, что пользователи не будут взаимодействовать с этим элементом. Результат вычислений отображается с помощью TextView.
- EditText — это вид TextView, который пользователи могут редактировать и изменять текст. Однако, поскольку калькулятор допускает только фиксированный набор входных данных, мы устанавливаем редактируемый текст как недоступный для редактирования. Когда пользователь нажимает на числа, мы отображаем числа в EditText.
- Button — этот элемент позволяет пользователю взаимодействовать и, в идеале, должен реагировать на щелчки пользователя. Мы используем кнопки для чисел и операторы в калькуляторе.
Создание макета калькулятора
Макет калькулятора длинноват. Это связано с тем, что мы должны явно определить и тщательно позиционировать каждую из кнопок в калькуляторе. Приведенный ниже фрагмент является сокращенной версией файла макета activity_main
...
Внутреннее устройство калькулятора
В нашем калькуляторе есть два значения: valueOne и valueTwo. Эти значения содержат числа, над которыми нужно работать. Оба значения относятся к типу double, поэтому они могут содержать числа с десятичными знаками и без них. Мы устанавливаем valueOne на специальное значение типа Double NaN (не число) по причинам, которые будут более понятны ниже.
private double valueOne = Double.NaN; private double valueTwo;
Этот простой калькулятор может выполнять только операции сложения, вычитания, умножения или деления. Итак, мы определяем четыре статических символа для представления этих операций и переменную CURRENT_ACTION, которая содержит следующую операцию, которую мы собираемся выполнить.
private static final char ADDITION = '+'; частный статический окончательный символ SUBTRACTION = '-'; частный статический окончательный символ MULTIPLICATION = '*'; частный статический окончательный символ DIVISION = '/'; private char CURRENT_ACTION;
Наконец, мы используем класс DecimalFormat для форматирования вывода нашего калькулятора. Конструктор десятичного формата позволяет отображать до десяти десятичных знаков.
decimalFormat = new DecimalFormat ("#. ########## ");
Обработка нажатий кнопок (чисел)
Каждый раз, когда пользователь нажимает число (или точку), мы просто хотите добавить это число в editText. В приведенном ниже примере кода показано, как это сделать для числа ноль (0).
binding.buttonZero.setOnClickListener (new View.OnClickListener () {@Override public void onClick (Просмотр просмотра) {binding.editText.setText (binding.editText.getText () + "0");}});
Обработка нажатий кнопок (операторы)
Обработка щелчков по операторам немного отличается. Мы хотели бы сначала выполнить любые ожидающие вычисления. Поэтому мы определяем метод computeCalculation. В computeCalculation, если valueOne является допустимым числом, мы читаем valueTwo из editText и выполнить текущую операцию в очереди. С другой стороны, если valueOne равно NaN, valueOne присвоит номер в editText.
private void co mputeCalculation () {если (! Double.isNaN (valueOne)) {valueTwo = Double.parseDouble (binding.editText.getText (). toString ()); binding.editText.setText (ноль); если (CURRENT_ACTION == ADDITION) valueOne = this.valueOne + valueTwo; иначе, если (CURRENT_ACTION == SUBTRACTION) valueOne = this.valueOne - valueTwo; иначе, если (CURRENT_ACTION == MULTIPLICATION) valueOne = this.valueOne * valueTwo; иначе, если (CURRENT_ACTION == DIVISION) valueOne = this.valueOne/valueTwo; } else {попробуйте {valueOne = Double.parseDouble (binding.editText.getText (). toString ()); } catch (Exception e) {}}}
Для каждого оператора мы сначала вызываем computeCalculation (), затем устанавливаем CURRENT_ACTION для выбранного оператора, а для оператора равенства ‘=’ мы вызываем computeCalculation (), затем очистите содержимое как valueOne, так и CURRENT_ACTION.
binding.buttonAdd.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {computeCalculation (); CURRENT_ACTION = ДОБАВЛЕНИЕ; binding.infoTextView.setText (decimalFormat.format (valueOne) + "+"); binding.editText.setText (null);}}); binding.buttonSubtract.setOnClickListener (новый View.OnClickListener () {@Override public void onClick (Просмотр представления) {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 binding (decimalFormat.format (* valueOne)) .editText.setText (null);}}); binding.buttonDivide.setOnClickListener (новый вид. OnClickListener () {@Override public void onClick (Просмотр представления) {computeCalculation (); CURRENT_ACTION = РАЗДЕЛ; binding.infoTextView.setText (decimalFormat.format (valueOne) + "/"); binding.editText.setText (ноль); }}); binding.buttonEqual.setOnClickListener (new View.OnClickListener () {@Override public void onClick (View view) {computeCalculation (); binding.infoTextView.setText (binding.infoTextView.getText (). toString () + decatimalFormat (valuewo) ) + "=" + decimalFormat.format (valueOne)); valueOne = Double.NaN; CURRENT_ACTION = '0';}});
Поздравляем! Вы завершили свое простое приложение-калькулятор для Android.
Наконец
Если вы запустите и воспользуетесь указанным выше приложением, вы заметите некоторые возможные области улучшений, например 1) щелкните оператор, когда editText очищен (т.е. без предварительного ввода числа), 2) разрешите пользователю продолжить вычисления после нажатия кнопки равенства.
Как всегда, полный исходный код доступен на github, и вы можете (более того, поощрять) изменять и использовать по своему усмотрению. Пожалуйста, напишите в комментариях, если вы нашли это полезным и/или хотите порекомендовать приложение для будущего урока.