Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Vi visar hur man skapar en enkel applikation för att rÀkna dricks pÄ Kotlin-sprÄket. Mer specifikt, Kotlin 1.3.21, Android 4, Android Studio 3. Artikeln kommer att vara intressant, framför allt för dem som börjar sin vÀg inom utvecklingen av Android-applikationer. Den gör det möjligt att förstÄ vad som fungerar och hur det fungerar inuti applikationen.

En sÄdan kalkylator Àr anvÀndbar nÀr man behöver rÀkna ut dricksbeloppet för ett sÀllskap som har bestÀmt sig för att tillbringa tid pÄ en restaurang eller ett café. SjÀlvklart lÀmnar inte alla och inte alltid dricks till servitörer, det Àr mer en vÀsterlÀndsk tradition, men utvecklingsprocessen av en sÄdan applikation Àr intressant i alla fall.

PĂ„minnelse: för alla lĂ€sare av "Habr" — 10 000 rubel rabatt vid registrering för vilken kurs som helst pĂ„ Skillbox med rabattkoden "Habr".

Skillbox rekommenderar: Praktisk kurs Mobilutvecklare PRO.

SÄ hÀr ser applikationen ut under drift:

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Du anger önskad procentandel av den totala summan, antal deltagare i mötet och fĂ„r resultatet — dricksbeloppet som bör lĂ€mnas.

Vi börjar

Det fullstÀndiga grÀnssnittet för applikationen ser ut som följer:
Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Det första steget — ladda projektets grundstruktur. Öppna den i Android Studio 3.0 eller senare. Bygg och kör projektet, och se en vit skĂ€rm. Allt Ă€r normalt, sĂ„ ska det vara.

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

AnvÀndarens ÄtgÀrder Àr angivna i projektet i kronologisk ordning, sÄ att allt ska vara klart. För att se det öppnar vi View -> Tool Windows -> TODO.

Vi studerar projektet och öppnar colors.xml för att bedöma fÀrgpaletten. I strings.xml finns textdata (etiketter), och i styles.xml finns det flera typsnittsmallar.

Utveckling av kostnadsavsnittet

Öppna activity_main.xml och lĂ€gg till koden nedan i LinearLayout (#1):

Nu kan du justera stil i directory-namnvalues eller leka med fÀrger, med hjÀlp av material.io-verktyget.

Nu ser projektet ut sÄ hÀr:

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?
Som du ser berÀknas kostnaderna utifrÄn de uppgifter som anvÀndaren anger.

Utveckling av rÀkenskapsavsnittet

LĂ€gg till koden nedan i LinearLayout efter Expense Section (#2):

<! — TODO #3: Bygg rĂ€knesektionen →
 



Vi stÀnger LinearLayout efter TODO-listan och lÀgger sedan till ny kod genom att placera den inuti LinearLayout (#3):

Eftersom appens huvudsyfte Àr att berÀkna individuella kostnader för varje deltagare vid restaurangbesök, Àr costPerPersonTextView av stor betydelse.

EditText begrÀnsar inmatning till en rad, detta parameter ska ha vÀrdet NumberDecimal inputType.

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?
Vi kör projektet för att testa och anger parametrarna för den totala skadan (ömtÄliga föremÄl som krossade muggar och tallrikar etc.).

Utveckling av avsnittet 'MĂ€nniskor och dricks'

För att lÀgga till val av dricksbelopp, infoga följande kod i den nya sektionen LinearLayout (#4):

Denna kodavsnitt Àr nödvÀndig för att exakt berÀkna beloppet för dricks. StandardvÀrdet för texten Àr 20. ImageButtons Àr försedda med ikoner i mappen med skrivbehörighet.

Vi kopierar hela avsnittet och lÀgger till följande (#5):

  • ImageButton ids (subtractPeopleButton, addPeopleButton)
  • TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)
  • DefaultText för numberOfPeopleTextView (ska vara 4).

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Nu, vid start av appen, finns det möjlighet att lÀgga till summan av notan, knapparna 'LÀgg till/Drag bort' fungerar ocksÄ, men just nu hÀnder inget.

Vi lÀgger till Views

Vi öppnar MainActivity.kt och lÀgger till detta i funktionen 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: Bind Buttons to Listener
 
//TODO #16: Bind EditText to TextWatcher
 
}

FÀrdigstÀll knapparna

För att lÀgga till klickstöd för knapparna implementerar vi View.OnClickListener pÄ klassnivÄ (#7):

class MainActivity: AppCompatActivity(), View.OnClickListener {

Det gÄr inte att kompilera projektet just nu, vi behöver utföra nÄgra fler ÄtgÀrder (#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()
        }
    }

Knappar och switchar i Kotlin Àr verkligen vÀl organiserade! LÀgg till koden nedan i alla increment- och decrement-funktioner
(#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()
        }
    }

Denna kod skyddar increment-funktionerna med maximala vÀrden (MAX_TIP & MAX_PEOPLE). Dessutom skyddar koden decrement-funktionerna med minimala vÀrden (MIN_TIP & MIN_PEOPLE).

Nu lÀnkar vi knapparna till lyssnare i funktionen initViews (#13):

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

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Nu kan vi rÀkna ut den totala kostnaden, dricks och antal deltagare. Och det viktigaste


Avsnitt för kostnadsberÀkning

Denna kod rÀknar ut kostnaden (#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)
 
}

Och hÀr anropas funktionen som möjliggör att ta hÀnsyn till antalet personer i sÀllskapet och rÀkna ut dricksen (#15):

private fun incrementTip() {
 


 
}
 
private fun decrementTip() {
 


 
}
 
private fun incrementPeople() {
 


 
}
 
private fun decrementPeople() {
 


 
}

Vi startar appen. Den ser bra ut och fungerar utmÀrkt. Men det kan bli Ànnu bÀttre.

Om du försöker ta bort summan av notan och sedan öka antalet tips eller vÀnner kommer appen att krascha eftersom det inte finns nÄgon kontroll för nollvÀrdet. Dessutom, om du försöker Àndra summan av notan kommer kostnaderna inte att uppdateras.

Sista stegen

LĂ€gg till TextWatcher (#16):

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

Sedan integrerar vi lyssnaren billEditText (#17):

billEditText.addTextChangedListener(this)

Plus vi lÀgger till koden för att köra 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) {}

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Och nu fungerar allt perfekt! Grattis, du har skrivit din egen "Dricksbok" i Kotlin.

Att skapa en dricks-kalkylator i Kotlin: hur fungerar det?

Skillbox rekommenderar:

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster