
RÀÀgime, kuidas luua lihtne rakendus, et arvutada jootraha Kotlinis. TÀpsemalt Kotlin 1.3.21, Android 4, Android Studio 3. Artikkel on huvitav eelkÔige neile, kes alustavad oma teekonda Android-rakenduste arenduses. See aitab mÔista, kuidas ja mis rakenduses toimib.
Selline kalkulaator on kasulik, kui on vaja arvutada jootraha summa nhóm, kes otsustas aega veeta restoranis vÔi kohvikus. Muidugi ei jÀta kÔik ja alati teenindajatele jootraha, see on rohkem lÀÀne traditsioon, kuid sellise rakenduse arendamise protsess on igal juhul huvitav.
Tuletame meelde: kĂ”igile «Habr» lugejatele â 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi «Habr».
Skillbox soovitab: Praktiline kursus .
Nii nÀeb rakendus vÀlja tööprotsessis:

Sisestate soovitud protsendi kogusummast, kohtumiste arvu ja saate tulemuse - jootraha summa, mille peaksite jÀtma.
Alustame
Rakenduse tÀisliides nÀeb vÀlja jÀrgmine:


Esimene tegevus - . Avame selle Android Studio 3.0 vÔi uuema versiooniga. Ehitage ja kÀivitage projekt ning nÀete valget ekraani. KÔik on korras, see on nii, nagu peab.


Kasutaja toimingud on projekti sarnases jÀrjestuses, et kÔik oleks arusaadav. Selle vaatamiseks avame View -> Tool Windows -> TODO.
Uurime projekti ja avame colors.xml, et hinnata vÀrvipaletti. Tekstid on salvestatud strings.xml ja styles.xmls on mitu fondimalli.
Kulude jaotuse arendamine
Avame activity_main.xml ja lisame allpool oleva koodi LinearLayout'i (#1):
<TextView
android_id="@+id/expensePerPersonTextView"
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_paddingTop="30dp"
style="@style/h1Bold"
android_textColor="@color/colorAccent"
android_text="0"/>
<TextView
android_layout_width="match_parent"
android_layout_height="wrap_content"
android_paddingBottom="25dp"
style="@style/h2"
android_textColor="@color/colorAccent"
android_text="@string/perPersonStaticText"/>NĂŒĂŒd saab seadistada stiili kausta values vĂ”i mĂ€ngida vĂ€rvidega, kasutades .
Praegu nÀeb projekt vÀlja nii:

Nagu nÀete, tehakse kulude arvutust vastavalt kasutaja sisestatud andmetele.
Arve jaotuse arendamine
Lisame allpool oleva koodi LinearLayout'i pÀrast Expense Section'i (#2):
<LinearLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_orientation="vertical"
android_background="@color/colorAccent">
<! â TODO #3: Build Bill Section â
âŠ
<\/LinearLayout>Sulgeb LinearLayout pÀrast TODOde loetelu ja lisame seejÀrel uue koodi, paigutades selle LinearLayout'i sisse (#3):
Kuna rakenduse peamine eesmĂ€rk on igaĂŒhe kulude individuaalne arvutamine restoranis, mĂ€ngib costPerPersonTextView suurimat rolli.
EditText piirab andmete sisestamist ĂŒhe reaga, sellel parameetril peab olema NumberDecimal inputType vÀÀrtus.

KĂ€ivitame projekti testimiseks ja sisestame kogukahjude parameetrid (katkised tassid, taldrikud jne).
Jaotise âInimesed jaTipsâ arendamine
Kuna tahame lisada valiku jootrahade koguse kohta, sisestame allpool oleva koodi uude LinearLayout'i sektsiooni (#4):
See koodijupp on vajalik jootrahade summa tÀpseks arvutamiseks. Vaikimisi teksti vÀÀrtus on 20. ImageButton'id on varustatud ikoonidega kirjeldusÔigustes.
Kopeerime jaotise tÀielikult ja lisame jÀrgmise (#5):
- ImageButton'i ids (subtractPeopleButton, addPeopleButton)
- TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)
- DefaultText numberOfPeopleTextView jaoks (peab olema 4).

NĂŒĂŒd rakenduse kĂ€ivitamisel on vĂ”imalus lisada arve summa, samuti töötavad nupud 'Lisa/VĂ”ta Ă€ra', kuid praegu ei toimu midagi.
Lisame Views
Avame MainActivity.kt ja lisame jÀrgmise initViews funktsiooni (#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: Bind Buttons to Listener
//TODO #16: Bind EditText to TextWatcher
}Viimeistelemme painikkeet
LisÀtÀÀn painikkeiden klikkaustuki kÀyttÀmÀllÀ View.OnClickListener-luokkaa (#7):
class MainActivity: AppCompatActivity(), View.OnClickListener {
Projektia ei voi kÀÀntÀÀ nyt, on suoritettava vielÀ muutama toimenpide (#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()
}
} Kotlinissa painikkeiden ja kytkimien hallinta on todella hienoa! LisÀÀ alla oleva koodi kaikkiin increment- ja decrement-funktioihin
(#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()
}
}TÀssÀ koodi suojaa increment-toiminnot maksimiarvoilta (MAX_TIP & MAX_PEOPLE). LisÀksi, koodi suojaa decrement-toiminnot minimimÀÀriltÀ (MIN_TIP & MIN_PEOPLE).
Nyt yhdistÀmme painikkeet kuuntelijoihin initViews-funktiossa (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Bind EditText to TextWatcher
} 
Nyt voimme laskea yhteiset kulut, tipit ja osallistujamÀÀrĂ€t. Ja nyt kaikkein tĂ€rkeinâŠ
Kulujen laskenta jaottelu
TÀmÀ koodi laskee kulut (#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)
}Ja tÀssÀ kutsutaan funktiota, joka ottaa huomioon ryhmÀn koon ja laskee tipit (#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 veel parem olla.
Kui proovite kustutada arve summat ja seejÀrel suurendada vihjete vÔi sÔprade arvu, siis rakendus kukub, kuna kulude nullvÀÀrtuse kontrollimist pole veel tehtud. Veelgi enam, kui proovite muuta arve summat, kulud ei uuene.
LÔppastmed
Lisame TextWatcher (#16):
class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
SeejÀrel lisame kuulaja billEditText (#17):
billEditText.addTextChangedListener(this)
Pluss lisame koodi TextWatcher'i teostamiseks (#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 tĂ€iesti hĂ€sti! Palju Ă”nne, olete kirjutanud oma «Jootraha kalkulaatori» Kotlin'is.

Skillbox soovitab:
- Kaks aastat praktilist kursust .
- Veebikursus .
- Praktiline aastakursus .
Allikas: habr.com
