
Në këtë artikull do t'ju tregojmë se si të krijoni një aplikacion të thjeshtë për llogaritjen e bakshishit në gjuhën Kotlin. Më saktësisht, Kotlin 1.3.21, Android 4, Android Studio 3. Artikulli do të jetë interesante, para së gjithash, për ata që po fillojnë rrugëtimin e tyre në zhvillimin e aplikacioneve Android. Ai lejon të kuptohet se çfarë ndodh dhe si funksionon brenda aplikacionit.
Ky kalkulator do të jetë i dobishëm kur duhet të llogariteni shumën e bakshishit nga një grup që ka vendosur të kalojë kohë në një restorant apo kafene. Sigurisht, nuk të gjithë dhe jo gjithmonë lënë bakshish për kamarierët, kjo është më shumë një traditë perëndimore, por procesi i zhvillimit të një aplikacioni të tillë është gjithsesi interesant.
KujtojmĂ«: pĂ«r tĂ« gjithĂ« lexuesit e «Habra» â zbritje prej 10,000 rublesh pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promovues «Habr».
Skillbox rekomandon: Kurs praktik .
Këtu si duket aplikacioni gjatë funksionimit:

Ju futni pĂ«rqindjen e dĂ«shiruar nga shuma totale, numrin e pjesĂ«marrĂ«sve nĂ« takim dhe merrni rezultatin â shumĂ«n e bakshishit qĂ« duhet tĂ« lini.
Të fillojmë
Interfejsi i plotë i aplikacionit duket si më poshtë:


Veprimi i parĂ« â . E hapim atĂ« nĂ« Android Studio 3.0 ose njĂ« version mĂ« tĂ« ri. NdĂ«rtojmĂ« dhe ekzekutojmĂ« projektin dhe shohim njĂ« ekran tĂ« bardhĂ«. Gjithçka Ă«shtĂ« nĂ« rregull, kĂ«shtu duhet tĂ« jetĂ«.


Veprimet e përdoruesit janë shkruar në projekt në rend kronologjik, që të jetë e qartë. Për ta parë atë hapim View -> Tool Windows -> TODO.
Studioni projektin dhe hapni colors.xml për t'u vlerësuar paletat e ngjyrave. Në strings.xml është vendosur të dhënat tekstuale (etiketat), ndërsa në styles.xml ka disa shabllone fontesh.
Zhvillimi i seksionit të shpenzimeve
Hapni activity_main.xml dhe shtoni kodin e mëposhtëm në LinearLayout (#1):
Tani mund të konfiguroni stilin e drejtorisë values ose të luani me ngjyrat, duke përdorur .
Aktualisht projekti duket kështu:

Siç e shihni, llogaritja e shpenzimeve bëhet mbi të dhënat që përdoruesi fut.
Zhvillimi i seksionit të faturave
Shtoni kodin, i cili është vendosur më poshtë, në LinearLayout pas Seksionit të Shpenzimeve (#2):
<! â TODO #3: NdĂ«rto Seksionin e FaturĂ«s â
âŠMbyllim LinearLayout pas listĂ«s sĂ« TODO-ve dhe mĂ« pas shtojmĂ« kodin e ri duke e vendosur ato brenda LinearLayout (#3):
Për shkak se qëllimi kryesor i aplikacionit është llogaritja e shpenzimeve të individualizuar për secilin pjesëmarrës në darkë, kostot për person janë shumë të rëndësishme.
EditText e kufizon hyrjen në një rresht; ky parametër duhet të ketë vlerën NumberDecimal inputType.

Nisemi me projektin për testim dhe futim parametrat e dëmtimit të përgjithshëm (filxhanë, pjata të thyera, etj.)
Zhvillimi i seksionit "Njerëzit dhe tips"
Për të shtuar zgjedhjen e shumës së tipsit, futim kodin më poshtë në një seksion të ri LinearLayout (#4):
Ky fragment kodi është i nevojshëm për llogaritjen e saktë të shumës së tipsit. Vlera e parazgjedhur e tekstit është 20. ImageButtons janë të pajisura me ikona në dosjen me të drejta shkrimi.
Kopjojmë plotësisht seksionin dhe shtojmë të ardhshëm (#5):
- Id-të e ImageButton (subtractPeopleButton, addPeopleButton)
- Id-të e TextView (numberOfPeopleStaticText, numberOfPeopleTextView)
- DefaultText për numberOfPeopleTextView (duhet të jetë 4).

Tani, kur nisim aplikacionin, ekziston mundësia për të shtuar shumën e faturës, gjithashtu funksionojnë butonat "Shto/Subtraho", por akoma nuk ndodh asgjë.
Shtojmë Views
Hapim MainActivity.kt dhe shtojmë këtë në funksionin initViews (#6):
fun private 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: Lidhen butonat me dëgjuesit
//TODO #16: Lidhen EditText me TextWatcher
}Po përfundojmë butonat
Për të shtuar mbështetje për klikimet e butonave, implementojmë View.OnClickListener në nivelin e klasës (#7):
class MainActivity: AppCompatActivity(), View.OnClickListener {
Tani nuk do të mund të kompiloni projektin, duhen bërë disa veprime të tjera (#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()
}
} Sa i përket butonave dhe çelsëve, në Kotlin gjithçka është organizuar shumë mirë! Shtojmë kodin e vendosur më poshtë në të gjitha funksionet increment dhe 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()
}
}Ky kod mbron funksionet e rritjes me vlera maksimale (MAX_TIP & MAX_PEOPLE). Gjithashtu, kodi mbron funksionet e zvogëlimit me vlera minimale (MIN_TIP & MIN_PEOPLE).
Tani lidhim butonat me dëgjuesit në funksionin initViews (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Lidhen EditText me TextWatcher
} 
Tani mund të shtoni dëmin total, këshillat dhe numrin e pjesëmarrësve në takim. Dhe tani gjëja më e rëndësishme...
Sekcioni i llogaritjes së shpenzimeve
Ky kod llogarit shpenzimet (#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)
}Këtu thirret funksioni që mundëson marrjen parasysh të numrit të njerëzve në kompani dhe llogaritjen e këshillave (#15):
private fun incrementTip() {
âŠ
}
private fun decrementTip() {
âŠ
}
private fun incrementPeople() {
âŠ
}
private fun decrementPeople() {
âŠ
}Po fillon aplikacionin. Duket dhe punon shkëlqyeshëm. Por mund të jetë edhe më mirë.
Nëse provoni të fshini shumën e faturës dhe pastaj të rritni numrin e këshillave ose miqve, aplikacioni do të bjerë, pasi ende nuk ka një kontroll për vlerat e zeruara të kostove. Më shumë, nëse provoni të ndryshoni shumën e faturës, shpenzimet nuk do të përditësohen.
Hapat përfundimtarë
Shtojmë TextWatcher (#16):
class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
Në vazhdim, përfshijmë dëgjuesin billEditText (#17):
billEditText.addTextChangedListener(this)
Plus, shtojmë kodin për të realizuar 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) {} 
Tani, gjithçka funksionon absolutisht! Urime, keni shkruar kalkulatorin tuaj të këshillave në Kotlin.

Skillbox rekomandon:
- Kursi praktik dyvjeçar .
- Kurs online .
- Kurs praktik njëvjeçar .
Burimi: habr.com
