
RÀÀgime, kuidas luua lihtne rakendus, et arvutada jootraha Kotlin keeles. TÀpsemalt öeldes, Kotlin 1.3.21, Android 4, Android Studio 3. See artikkel on eelkÔige huvitav neile, kes alustavad oma teed Android-rakenduste arendamisel. See aitab mÔista, mis ja kuidas rakenduses töötab.
See kalkulaator tuleb kasuks, kui tuleb arvutada jootraha summa ettevÔtte jaoks, kes otsustas veeta aega restoranis vÔi kohvikus. Loomulikult ei jÀta kÔik ja alati teenindajatele jootraha, see on pigem lÀÀne traditsioon, kuid sellise rakenduse arendamise protsess on igal juhul huvitav.
Tuletame meelde: kĂ”igile «Habra» lugejatele â 10 000 rubla soodustus, kui registreerite end Skillboxi mis tahes kursusele promokoodi «Habr» abil.
Skillbox soovitab: Praktiline kursus .
Nii nÀeb rakendus vÀlja töö kÀigus:

Sisestate soovitud protsendi kogusummast, kohtumise osalejate arvu ja saate tulemuse â jootrahade summa, mille jĂ€tmine on soovitatav.
Alustame
Rakenduse tÀielik liides nÀeb vÀlja jÀrgmine:


Esimene samm â . Avame selle Android Studio 3.0 vĂ”i uuema versiooniga. Ehitasime ja kĂ€ivitasime projekti ning nĂ€eme valget ekraani. KĂ”ik on korras, just nii peab olema.


Kasutaja toimingud on projektis kirja pandud kronoloogiliselt, et kÔik oleks arusaadav. Selle vaatamiseks avame View -> Tool Windows -> TODO.
Uurime projekti ja avame colors.xml, et hinnata vÀrvipaletti. Text-andmetega (nimetused) on strings.xml-is, samas styles.xml-is on mitu fondimalli.
Kulude jaotuse vÀljatöötamine
Avame activity_main.xml ja lisame allpool olevat koodi LinearLayout'i (#1):
NĂŒĂŒd on vĂ”imalik seadistada values katalooge vĂ”i eksperimenteerida vĂ€rvidega, kasutades .
Praegu nÀeb projekt vÀlja nii:

Nagu nÀete, arvutatakse kulud kasutaja sisestatud andmete pÔhjal.
Arvete jaotuse vÀljatöötamine
Lisame allpool oleva koodi LinearLayout'i pÀrast Expense Section'i (#2):
<! â TODO #3: Build Bill Section â
âŠSulgege LinearLayout pĂ€rast TODOde loendit ja lisage uus kood, paigutades selle LinearLayout'i sisse (#3):
Kuna rakenduse peamine ĂŒlesanne on arvutada iga restorani kĂŒlastaja individuaalsed kulud, on costPerPersonTextView'i roll vĂ€ga oluline.
EditText piirab andmete sisestamist ĂŒhe reale, seda parameetrit peab olema NumberDecimal inputType.

KĂ€ivitage projekt testimiseks ja sisestage ĂŒldise kahju parameetrid (katkised tassid, taldrikud jne).
Inimeste ja jootraha sektsiooni vÀljatöötamine
Et lisada jootraha valimist, sisestage allolev kood uude LinearLayout'i sektsiooni (#4):
See koodijupp on vajalik tipprekete tĂ€pseks arvutamiseks. Vaikimisi tekst on 20. ImageButtonâid sisaldavad ikoone kirja Ă”iguste kaustas.
Kopeerime jagu tÀielikult ja lisame jÀrgmist (#5):
- ImageButton'id (subtractPeopleButton, addPeopleButton)
- TextView'id (numberOfPeopleStaticText, numberOfPeopleTextView)
- DefaultText numberOfPeopleTextView jaoks (peab olema 4).

NĂŒĂŒd, kui rakendus kĂ€ivitub, on vĂ”imalik lisada arve summa, samuti töötavad nupud "Lisa/VĂ”ta vĂ€lja", kuid praegu ei toimu midagi.
Lisame Views
Avame MainActivity.kt ja lisame see funktsiooni 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: Siduda nuppe kuulajaga
//TODO #16: Siduda EditText TextWatcheriga
}Viimistleme nuppe
Nuppude klikkimise toe lisamiseks rakendame View.OnClickListener klassi tasemel (#7):
class MainActivity: AppCompatActivity(), View.OnClickListener {
Praegu ei Ônnestu projekti kompileerida, vajalik on teha veel mÔned toimingud (#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()
}
} Kotlinis on nuppude ja lĂŒlitite haldamine vĂ€ga hea! Lisame alljĂ€rgneva koodi kĂ”ikidesse increment ja decrement funktsioonidesse
(#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()
}
}Siin on kood, mis kaitseb suurenemise funktsioone maksimaalse vÀÀrtusega (MAX_TIP ja MAX_PEOPLE). Lisaks kaitseb kood langetamise funktsioone minimaalsete vÀÀrtustega (MIN_TIP ja MIN_PEOPLE).
Se now we link buttons to listeners in the initViews function (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Bind EditText to TextWatcher
} 
NĂŒĂŒd on vĂ”imalik lisada kogukahju, jootraha ja osalejate arvu. Ja nĂŒĂŒd kĂ”ige tĂ€htsamâŠ
Kulude arvestamise osa
See kood arvutab kulud (#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)
}Siin kutsutakse vÀlja funktsioon, mis vÔimaldab arvestada inimeste arvu firmas ja arvutada kÔhtu (#15):
private fun incrementTip() {
âŠ
}
private fun decrementTip() {
âŠ
}
private fun incrementPeople() {
âŠ
}
private fun decrementPeople() {
âŠ
}KÀivitame rakenduse. See nÀeb vÀlja ja töötab suurepÀraselt. Kuid vÔiks olla veelgi parem.
Kui proovite kustutada arve summa ja seejÀrel suurendada nÀpunÀidete vÔi sÔprade arvu, kukub rakendus kokku, kuna kulude nulli vÀÀrtuse kontrolli pole veel olemas. Veelgi enam, kui proovite muuta arve summat, ei uuene kulud.
LÔppfaasid
Lisame TextWatcher'i (#16):
class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
SeejÀrel sisestame billEditText jaoks kuulaja (#17):
billEditText.addTextChangedListener(this)
Lisame ka koodi TextWatcher'i tÀitmiseks (#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) {} 
NĂŒĂŒd töötab kĂ”ik ideaalselt! Palju Ă”nne, olete kirjutanud oma «Joogiraha kalkulaatori» Kotlinis.

Skillbox soovitab:
- Kaheaastane praktiline kursus .
- Veebikursus .
- Praktiline aastakursus .
Allikas: habr.com
