Створення калькулятора чайових на Kotlin: як це працює?
Розповідаємо, як створити простий додаток для розрахунку чайових мовою Kotlin. Якщо точніше, то Kotlin 1.3.21, Android 4, Android Studio 3. Стаття буде цікавою насамперед для тих, хто починає свій шлях у розробці Android-додатків. Вона дозволяє зрозуміти, що і як працює всередині програми.
Такий калькулятор стане в нагоді, коли потрібно підрахувати суму чайових з компанії, яка вирішила провести час у ресторані чи кафе. Звичайно, не всі і не завжди залишають офіціантам на чай, це більше західна традиція, але процес розробки такого додатку у будь-якому разі цікавий.
Нагадуємо:для всіх читачів "Хабра" - знижка 10 000 рублів при записі на будь-який курс Skillbox за промокодом "Хабр".
Ви вводите бажаний відсоток із загальної суми, кількість учасників зустрічі та отримуєте результат – суму чайових, які варто залишити.
починаємо
Повний інтерфейс програми виглядає так:
Перша дія - завантаження основи проекту. Відкриваємо її в Android Studio 3.0 або пізнішій версії. Будуємо та запускаємо проект і бачимо білий екран. Все нормально, так і має бути.
Дії користувача прописані у проекті у хронологічному порядку, щоб усе було зрозуміло. Для перегляду відкриваємо View -> Tool Windows -> TODO.
Вивчаємо проект та відкриваємо colors.xml для оцінки палітри кольорів. У strings.xml розміщені текстові дані (підписи), а в styles.xml є кілька шрифтових шаблонів.
Розробка розділу витрат
Відкриваємо activity_main.xml і додаємо розташований нижче код у LinearLayout (#1):
Оскільки головне завдання програми - розрахунок індивідуальних витрат для кожного з учасників посиденьок у ресторані, то основне значення відіграє costPerPersonTextView.
EditText обмежує введення даних одним рядком, цей параметр має бути значення NumberDecimal inputType.
Запускаємо проект для тесту та вводимо параметри загальної шкоди (розбиті чашки, тарілки тощо)
Розробка розділу «Люди та чайові»
Щоб додати вибору обсягу чайових, вставляємо розташований нижче код у нову секцію LinearLayout (#4):
У плані кнопок і свитків у Kotlin все організовано дуже круто! Додаємо розміщений нижче код у всі функції increment та decrement
(#9 - #12):
private fun incrementTip() {
if (tipPercent != MAX_TIP) {
tipPercent += TIP_INCREMENT_PERCENT
tipTextView.text = String.format("%d%%", tipPercent)
}
}
private fun decrementTip() {
if (tipPercent != MIN_TIP) {
tipPercent -= TIP_INCREMENT_PERCENT
tipTextView.text = String.format("%d%%", tipPercent)
}
}
private fun incrementPeople() {
if (numberOfPeople != MAX_PEOPLE) {
numberOfPeople += PEOPLE_INCREMENT_VALUE
numberOfPeopleTextView.text = numberOfPeople.toString()
}
}
private fun decrementPeople() {
if (numberOfPeople != MIN_PEOPLE) {
numberOfPeople -= PEOPLE_INCREMENT_VALUE
numberOfPeopleTextView.text = numberOfPeople.toString()
}
}
Тут код захищає функції збільшення з максимальними значеннями (MAX_TIP & MAX_PEOPLE). Крім того, код захищає функції декремента із мінімальними значеннями (MIN_TIP & MIN_PEOPLE).
Тепер зв'язуємо кнопки зі слухачами функції initViews (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Bind EditText to TextWatcher
}
Тепер можна додавати загальні збитки, чайові та кількість учасників зустрічі. Ну і тепер найголовніше…
Розділ підрахунку витрат
Цей код підраховує витрати (#14):
private fun calculateExpense() {
val totalBill = billEditText.text.toString().toDouble()
val totalExpense = ((HUNDRED_PERCENT + tipPercent) / HUNDRED_PERCENT) * totalBill
val individualExpense = totalExpense / numberOfPeople
expensePerPersonTextView.text = String.format("$%.2f", individualExpense)
}
Ну а тут викликається функція, яка дає змогу врахувати кількість людей у компанії та підрахувати чайові (#15):
private fun incrementTip() {
…
}
private fun decrementTip() {
…
}
private fun incrementPeople() {
…
}
private fun decrementPeople() {
…
}
Запускаємо програму. Виглядає і працює воно чудово. Але може бути краще.
Якщо ви спробуєте видалити суму рахунку, а потім збільшити кількість підказок або друзів, програма впаде, оскільки ще немає перевірки для нульового значення витрат. Більше того, якщо ви спробуєте змінити суму рахунку, витрати не будуть оновлені.
Фінальні кроки
Додаємо TextWatcher (#16):
class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
Потім вбудовуємо слухач billEditText (#17):
billEditText.addTextChangedListener(this)
Плюс додаємо код для виконання TextWatcher (#18):
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (!billEditText.text.isEmpty()) {
calculateExpense()
}
}
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
Ну, а тепер працює абсолютно все! Вітаю, ви написали свій «Калькулятор чайових» на Kotlin.