
Po flasim se si të krijoni një aplikacion të thjeshtë për llogaritjen e majave në gjuhën Kotlin. Nëse jemi më të saktë, Kotlin 1.3.21, Android 4, Android Studio 3. Ky artikull do të jetë i interesant, në radhë të parë, për ata që po fillojnë rrugëtimin e tyre në zhvillimin e aplikacioneve Android. Ai ndihmon në kuptimin e funksionimit të ndryshmëve brenda aplikacionit.
Ky kalkulator do të jetë i dobishëm kur duhet të llogaritni shumën e majave për një kompani që ka vendosur të kalojë kohë në një restorant ose kafené. Sigurisht, jo të gjithë dhe jo gjithmonë lënë majë për kamerierë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 rublej pĂ«r regjistrimin nĂ« çdo kurs Skillbox me kodin promocional "Habr".
Skillbox rekomandon: Kurs praktik .
Ja si duket aplikacioni në procesin e punës:

Ju jepni percentin e dĂ«shiruar tĂ« shumĂ«s totale, numrin e pjesĂ«marrĂ«sve nĂ« takim dhe merrni rezultatin â shumĂ«n e majave qĂ« duhet tĂ« lini.
Fillojmë
Interfaci 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. E ndĂ«rtuam dhe e ekzekutuam projektin dhe pamĂ« njĂ« ekran tĂ« bardhĂ«. Ădo gjĂ« Ă«shtĂ« nĂ« rregull, ashtu duhet tĂ« jetĂ«.


Veprimet e përdoruesit janë të renditura në projekt në rend kronologjik, për ta kuptuar lehtësisht. Për ta parë, hapim View -> Tool Windows -> TODO.
Studjojmë projektin dhe hapim colors.xml për të vlerësuar paletën e ngjyrave. Të dhënat tekstuale (etiketat) gjenden në strings.xml, ndërsa në styles.xml ka disa shabllone për fonte.
Zhvillimi i seksionit të shpenzimeve
Hapim activity_main.xml dhe shtojmë kodin e vendosur më poshtë në LinearLayout (#1):
Tani mund të konfiguroni stilin e drejtorisë values ose të eksperimentoni me ngjyrat, duke përdorur .
Aktualisht projekti duket kështu:

Siç e shihni, llogaritja e shpenzimeve bëhet sipas të dhënave që jep përdoruesi.
Zhvillimi i seksionit të faturave
Shtojmë kodin e vendosur më poshtë në LinearLayout pas Seksionit të Shpenzimeve (#2):
<! â TODO #3: NdĂ«rto Seksionin e Bill-ave â
âŠMbyllim LinearLayout pas listĂ«s TODO, dhe pastaj shtojmĂ« kodin e ri, duke e vendosur brenda LinearLayout (#3):
Duke qenë se qëllimi kryesor i aplikacionit është llogaritja e shpenzimeve individuale për secilin nga pjesëmarrësit në restorant, vlera kryesore luan costPerPersonTextView.
EditText kufizon hyrjen e të dhënave në një rresht, ky parametr duhet të ketë vlerën NumberDecimal inputType.

Fillojmë projektin për testim dhe futim parametrat e dëmit të përgjithshëm (pjesë të thyera, pjata etj.)
Zhvillimi i seksionit 'Njerëzit dhe dhuratat'
Për të shtuar zgjedhjen e shumës së dhuratave, futim kodin e vendosur më poshtë në një seksion të ri LinearLayout (#4):
Ky segment i kodit është i nevojshëm për llogaritjen e saktë të shumës së dhuratës. Vlera e paracaktuar e tekstit është 20. ImageButtons janë të pajisura me ikona në dosjen e të drejtave të shkruar.
Kopjojmë plotësisht seksionin dhe shtojmë të following (#5):
- ImageButton ids (subtractPeopleButton, addPeopleButton)
- TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)
- DefaultText për numberOfPeopleTextView (duhet të jetë 4).

Tani, kur запŃŃĐșĐ°Đ”ĐŒ aplikimi, ka mundĂ«sinĂ« pĂ«r tĂ« shtuar shumĂ«n e llogarisĂ«, gjithashtu punojnĂ« butonat âShto/Hiqâ, por deri mĂ« tani nuk ndodh asgjĂ«.
Shtohedhim Views
Hapim MainActivity.kt dhe shtojmë këtë në funksionin initViews (#6):
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: Lidheni butonat me dëgjuesin
//TODO #16: Lidheni EditText me TextWatcher
}Përfundojmë butonat
Për të shtuar mbështetje për klikimet e butonave, zbatoni View.OnClickListener në nivelin e klasës (#7):
class MainActivity: AppCompatActivity(), View.OnClickListener {
Tani nuk do të mund të kompiloni projektin, duhen kryer edhe disa hapa të tjerë (#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()
}
} Në planin e butonave dhe ndërruesve, Kotlin është organizuar shumë mirë! Shtojeni kodin e mëposhtëm në të gjitha funksionet increment dhe decrement
(#9ââ#12):
fun private incrementTip() {
if (tipPercent != MAX_TIP) {
tipPercent += TIP_INCREMENT_PERCENT
tipTextView.text = String.format("%d%%", tipPercent)
}
}
fun private decrementTip() {
if (tipPercent != MIN_TIP) {
tipPercent -= TIP_INCREMENT_PERCENT
tipTextView.text = String.format("%d%%", tipPercent)
}
}
fun private incrementPeople() {
if (numberOfPeople != MAX_PEOPLE) {
numberOfPeople += PEOPLE_INCREMENT_VALUE
numberOfPeopleTextView.text = numberOfPeople.toString()
}
}
fun private 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). Për më tepër, ky kod mbron funksionet e zvogëlimit me vlera minimale (MIN_TIP & MIN_PEOPLE).
Tani, lidhim butonat me dëgjuesit në funksionin initViews (#13):
fun private initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Lidh EditText me TextWatcher
} 
Tani mund të shtoni dëm të përgjithshëm, këshilla dhe numrin e pjesëmarrësve në takim. Tani, gjëja më e rëndësishme...
Seksi i llogaritjes së shpenzimeve
Ky kod llogarit shpenzimet (#14):
funksioni privat 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ë lejon të merret parasysh numri i personave në kompani dhe të llogariten bakshishët (#15):
funksioni privat incrementTip() {
âŠ
}
funksioni privat decrementTip() {
âŠ
}
funksioni privat incrementPeople() {
âŠ
}
funksioni privat decrementPeople() {
âŠ
}Po e nisim aplikacionin. Duket dhe funksionon shkëlqyeshëm. Por mund të jetë edhe më mirë.
Nëse përpiqeni të fshini shumën e faturës dhe më pas të rrisni numrin e bakshishëve ose miqve, aplikacioni do të bjerë, pasi nuk ka ende kontroll për vlerën e zero. Për më tepër, nëse përpiqni të ndryshoni shumën e faturës, shpenzimet nuk do të përditësohen.
Hapat përfundimtarë
Shtojmë TextWatcher (#16):
klasa MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
Më pas, vendosim dëgjuesin në billEditText (#17):
billEditText.addTextChangedListener(this)
Plus, shtojmë kodin për të ekzekutuar 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 plotësisht! Urime, keni shkruar kalkulatorin tuaj të dhuratave në Kotlin.

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