Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Îți prezentăm cum să creezi o aplicație simplă pentru calcularea bacșișului în limbajul Kotlin. Mai exact, folosind Kotlin 1.3.21, Android 4, Android Studio 3. Articolul va fi interesant, în primul rând, pentru cei care încep drumul în dezvoltarea aplicațiilor Android. Aceasta permite înțelegerea modului în care funcționează aplicația.

Un astfel de calculator este util atunci când trebuie să calculezi suma bacșișului pentru o companie care a decis să petreacă timp într-un restaurant sau cafenea. Desigur, nu toată lumea și nu întotdeauna lasă bacșiș pentru chelneri, aceasta fiind mai mult o tradiție occidentală, dar procesul de dezvoltare a unei astfel de aplicații este interesant în orice caz.

Vă reamintim: pentru toți cititorii „Habr” — reducere de 10.000 de ruble la înscrierea la orice curs Skillbox cu codul de promovare „Habr”.

Skillbox recomandă: Curs practic „Dezvoltator Mobil PRO.

Iată cum arată aplicația în timpul funcționării:

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Introduci procentul dorit din suma totală, numărul de participanți la întâlnire și primești rezultatul — suma bacșișului care ar trebui lăsată.

Începem

Interfața completă a aplicației arată astfel:
Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Prima acțiune — încărcarea fundamentului proiectului. O deschidem în Android Studio 3.0 sau o versiune ulterioară. Construim și rulăm proiectul și vedem un ecran alb. Totul este în regulă, așa trebuie să fie.

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Acțiunile utilizatorului sunt scrise în proiect într-o ordine cronologică, astfel încât totul să fie clar. Pentru a le vizualiza, deschideți View -> Tool Windows -> TODO.

Examinăm proiectul și deschidem colors.xml pentru a evalua paleta de culori. În strings.xml sunt plasate datele textuale (etichete), iar în styles.xml există câteva șabloane de fonturi.

Dezvoltarea secțiunii de cheltuieli

Deschidem activity_main.xml și adăugăm codul de mai jos în LinearLayout (#1):

Acum poți ajusta stilul din directorul values sau poți experimenta cu culorile, folosind instrumentul material.io.

Acum proiectul arată astfel:

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?
Așa cum vezi, calculul cheltuielilor se face pe baza datelor introduse de utilizator.

Dezvoltarea secțiunii de facturi

Adăugăm codul de mai jos în LinearLayout după Secțiunea Cheltuieli (#2):

<! — TODO #3: Construiește Secțiunea Factură →
 
…

Închidem LinearLayout după lista de TODO-uri, apoi adăugăm noul cod, plasându-l în interiorul LinearLayout (#3):

Deoarece sarcina principală a aplicației este calcularea cheltuielilor individuale pentru fiecare dintre participanții la întâlnirile din restaurant, costPerPersonTextView are o importanță deosebită.

EditText limitează introducerea de date la o singură linie, iar acest parametru trebuie să aibă valoarea NumberDecimal inputType.

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?
Lansăm proiectul pentru testare și introducem parametrii daunei totale (farfurii, cești etc. sparte)

Dezvoltarea secțiunii „Oameni și bacșișuri”

Pentru a adăuga opțiunea de alegere a sumei pentru bacșiș, inserăm codul de mai jos într-o nouă secțiune LinearLayout (#4):

Această porțiune de cod este necesară pentru a calcula cu exactitate suma bacșișului. Valoarea implicită a textului este 20. ImageButtons sunt echipate cu pictograme în folderul cu permisiuni de scriere.

Copiem complet secțiunea și adăugăm următoarele (#5):

  • ImageButton ids (subtractPeopleButton, addPeopleButton)
  • TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)
  • DefaultText pentru numberOfPeopleTextView (trebuie să fie 4).

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Acum, la lansarea aplicației, există opțiunea de a adăuga suma facturii, iar butoanele „Adăugați/Scadeți” funcționează, dar momentan nu se întâmplă nimic.

Adăugăm Views

Deschidem MainActivity.kt și adăugăm aceasta în funcția 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: Leagă butoanele la Listener
 
//TODO #16: Leagă EditText la TextWatcher
 
}

Finalizăm butoanele

Pentru a adăuga suport pentru clicurile butoanelor, implementăm View.OnClickListener la nivel de clasă (#7):

class MainActivity: AppCompatActivity(), View.OnClickListener {

Compilarea proiectului nu va funcționa acum, trebuie să facem câteva acțiuni suplimentare (#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 ceea ce privește butoanele și comutatoarele, Kotlin este organizat foarte bine! Adăugăm codul de mai jos în toate funcțiile increment și 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()
        }
    }

Codul de aici protejează funcțiile de incrementare cu valorile maxime (MAX_TIP & MAX_PEOPLE). De asemenea, codul protejează funcțiile de decrementare cu valorile minime (MIN_TIP & MIN_PEOPLE).

Acum leagă butoanele de ascultători în funcția initViews (#13):

fun private initViews() {
 
...
 
addTipButton.setOnClickListener(this)
        subtractTipButton.setOnClickListener(this)
 
addPeopleButton.setOnClickListener(this)
        subtractPeopleButton.setOnClickListener(this)
 
//TODO #15: Leagă EditText la TextWatcher
}

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Acum putem adăuga cheltuieli totale, bacșiș și numărul de participanți la întâlnire. Și acum, partea cea mai importantă…

Secțiunea de calculare a cheltuielilor

Acest cod calculează cheltuielile (#14):

fun private 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)
 
}

Iar aici se apelează o funcție care permite considerarea numărului de persoane din grup și calcularea bacșișului (#15):

private fun incrementTip() {
 
…
 
}
 
private fun decrementTip() {
 
…
 
}
 
private fun incrementPeople() {
 
…
 
}
 
private fun decrementPeople() {
 
…
 
}

Lansăm aplicația. Arată și funcționează excelent. Însă ar putea fi și mai bine.

Dacă încercați să ștergeți suma facturii și apoi să creșteți numărul de tips sau prieteni, aplicația va crăpa, deoarece nu există încă o verificare pentru valoarea nulă a cheltuielilor. În plus, dacă încercați să schimbați suma facturii, cheltuielile nu vor fi actualizate.

Pașii finali

Adăugăm TextWatcher (#16):

class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {

Apoi încorporăm ascultătorul billEditText (#17):

billEditText.addTextChangedListener(this)

Plus adăugăm cod pentru a executa 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) {}

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Dar acum totul funcționează perfect! Felicitări, ați scris propriul „Calculatoare de tipsuri” în Kotlin.

Crearea unui calculator de bacșișuri în Kotlin: cum funcționează?

Skillbox recomandă:

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster