
Bemutatjuk, hogyan készíthetünk egy egyszerű alkalmazást a borravaló kiszámítására Kotlin nyelven. Pontosabban, a Kotlin 1.3.21, Android 4, Android Studio 3. Ez a cikk elsősorban azoknak érdekes, akik az Android-alkalmazásfejlesztés útjára lépnek. Segít megérteni, hogy mi és hogyan működik az alkalmazásban.
Ez a kalkulátor hasznos lesz, amikor ki kell számolni a borravalót egy csapat számára, amely úgy döntött, hogy étteremben vagy kávézóban tölti az időt. Természetesen nem mindenki és nem mindig ad borravalót a pincéreknek, ez inkább nyugati hagyomány, de egy ilyen alkalmazás fejlesztése így is érdekes.
Emlékeztetjük: minden «Habr» olvasónak 10 000 rubeles kedvezmény jár bármely Skillbox kurzus jelentkezésekor a «Habr» promóciós kód felhasználásával.
A Skillbox ajánlja: Gyakorlati kurzus .
Így néz ki az alkalmazás működés közben:

Beírja a kívánt százalékot az összegből, a résztvevők számát, és megkapja az eredményt – a borravalót, amit érdemes hagyni.
Kezdünk
Az alkalmazás teljes felülete a következőképpen néz ki:


Első lépés – Megnyitjuk az Android Studio 3.0 vagy újabb verziójában. Építjük és indítjuk a projektet, és egy fehér képernyőt látunk. Minden rendben, így kell lennie.


A felhasználói lépések időrendi sorrendben vannak meghatározva a projektben, hogy minden világos legyen. Ennek megtekintéséhez nyissa meg a Nézet -> Eszközablakok -> TODO menüpontot.
Megvizsgáljuk a projektet és megnyitjuk a colors.xml fájlt a színpaletta értékeléséhez. A strings.xml fájlban találhatók a szöveges adatok (feliratok), a styles.xml fájlban pedig néhány betűtípus sablon.
A költségek részének fejlesztése
Megnyitjuk az activity_main.xml fájlt, és hozzáadjuk az alábbi kódot a LinearLayouthoz (#1):
Most beállíthatja az értékek könyvtárának stílusát, vagy játszhat a színekkel a .
Most a projekt így néz ki:

Ahogy látja, a költségek kiszámítása a felhasználó által megadott adatokon alapul.
A számlák részének fejlesztése
Hozzáadjuk az alábbi kódot a LinearLayouthoz az Expense Section után (#2):
<! — TODO #3: Build Bill Section →
…Zárjuk le a LinearLayout-ot a TODO lista után, majd adjuk hozzá az új kódot, elhelyezve azt a LinearLayout-on belül (#3):
Mivel az alkalmazás fő feladata az éttermi költségek egyedi kiszámítása a résztvevők számára, a costPerPersonTextView játssza a legfontosabb szerepet.
Az EditText korlátozza az egy sorba történő adatbevitelt, ennek a paraméternek az inputType értékének NumberDecimal-nak kell lennie.

Indítsuk el a projektet egy teszt céljából, és adjuk meg a teljes kár paramétereit (törött bögrek, tányérok stb.).
A 'Népek és borravalók' rész fejlesztése.
A borravaló mennyiségének kiválasztásához illesszük be az alábbi kódot az új LinearLayout szekcióba (#4):
Ez a kódrészlet szükséges a borravaló pontos összegének kiszámításához. Az alapértelmezett szövegérték 20. Az ImageButtons ikonnal rendelkezik a writable mappában.
Teljesen másoljuk a szakaszt, és adjuk hozzá a következőt (#5):
- ImageButton azonosítók (subtractPeopleButton, addPeopleButton)
- TextView azonosítók (numberOfPeopleStaticText, numberOfPeopleTextView)
- DefaultText a numberOfPeopleTextView-hez (4-nek kell lennie).

Most, amikor elindítjuk az alkalmazást, van lehetőségünk hozzáadni a számlát, a 'Hozzáad'/'Kivon' gombok működnek, de egyelőre semmi sem történik.
Nézetek hozzáadása.
Nyissuk meg a MainActivity.kt-t, és adjuk hozzá ezt az initViews (#6) funkcióhoz:
private fun initViews() {
expensePerPersonTextView = findViewById(R.id.expensePerPersonTextView)
billEditText = findViewById(R.id.billEditText)
addTipButton = findViewById(R.id.addTipButton)
tipTextView = findViewById(R.id.tipTextView)
subtractTipButton = findViewById(R.id.subtractTipButton)
addPeopleButton = findViewById(R.id.addPeopleButton)
numberOfPeopleTextView = findViewById(R.id.numberOfPeopleTextView)
subtractPeopleButton = findViewById(R.id.subtractPeopleButton)
//TODO #8: Bind Buttons to Listener
//TODO #16: Bind EditText to TextWatcher
}Készítjük el a gombokat
A gombok kattinthatóságának hozzáadásához bevezetjük a View.OnClickListener-t a osztály szintjén (#7):
class MainActivity: AppCompatActivity(), View.OnClickListener {
A projektet most nem tudjuk fordítani, további lépéseket kell végrehajtani (#8):
override fun onClick(v: View?) {
when (v?.id) {
R.id.addTipButton -> incrementTip()
R.id.subtractTipButton -> decrementTip()
R.id.addPeopleButton -> incrementPeople()
R.id.subtractPeopleButton -> decrementPeople()
}
} A Kotlin gombok és kapcsolók szempontjából nagyon jól van megszervezve! Az alábbi kódot minden increment és decrement funkcióba добавить
(#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()
}
}Ez a kód védi a növelő funkciókat a maximális értékek (MAX_TIP & MAX_PEOPLE) mellett. Ezenkívül a kód védi a csökkentő funkciókat a minimális értékekkel (MIN_TIP & MIN_PEOPLE).
Most összekapcsoljuk a gombokat a figyelőkkel az initViews funkcióban (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Bind EditText to TextWatcher
} 
Most hozzáadhatjuk a közös költséget, borravalót és a résztvevők számát. És most a legfontosabb…
Költségszámító rész
Ez a kód számítja a költségeket (#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)
}Itt pedig meghívódik a funkció, ami lehetővé teszi a társaság létszámának figyelembevételét és a borravaló kiszámítását (#15):
private fun incrementTip() {
…
}
private fun decrementTip() {
…
}
private fun incrementPeople() {
…
}
private fun decrementPeople() {
…
}Elindítjuk az alkalmazást. Jól néz ki, és remekül működik. De lehetne jobb is.
Ha megpróbálja eltávolítani a számlát, majd növelni a borravalók vagy a barátok számát, az alkalmazás összeomlik, mivel még nincs ellenőrzés a nulla költségértékre. Sőt, ha megpróbálja megváltoztatni a számlát, a költségek nem frissülnek.
Végső lépések
Hozzáadjuk a TextWatchert (#16):
class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
Ezután beágyazzuk a billEditText felhasználót (#17):
billEditText.addTextChangedListener(this)
Plusz hozzáadjuk a TextWatcher végrehajtásához szükséges kódot (#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) {} 
Most pedig minden tökéletesen működik! Gratulálunk, írtál egy saját "Borravaló kalkulátort" Kotlin nyelven.

A Skillbox ajánlja:
- Kétéves gyakorlati tanfolyam .
- Online kurzus .
- Gyakorlati éves kurzus .
Forrás: habr.com
