
Wir erzĂ€hlen, wie man eine einfache Anwendung zur Berechnung von Trinkgeldern in Kotlin erstellt. Genauer gesagt, Kotlin 1.3.21, Android 4, Android Studio 3. Der Artikel wird in erster Linie fĂŒr diejenigen interessant sein, die ihren Weg in die Entwicklung von Android-Anwendungen beginnen. Er hilft zu verstehen, was und wie innerhalb der Anwendung funktioniert.
Ein solcher Rechner ist nĂŒtzlich, wenn man die Trinkgeldsumme fĂŒr eine Gesellschaft berechnen muss, die beschlossen hat, Zeit in einem Restaurant oder CafĂ© zu verbringen. NatĂŒrlich lassen nicht alle und nicht immer Trinkgeld, das ist eher eine westliche Tradition, aber der Prozess der Entwicklung einer solchen Anwendung ist auf jeden Fall interessant.
Wir erinnern daran: alle Leser von âHabrâ erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode âHabrâ.
Skillbox empfiehlt: Praktischer Kurs .
So sieht die Anwendung wÀhrend des Betriebs aus:

Sie geben den gewĂŒnschten Prozentsatz von der Gesamtsumme, die Anzahl der Teilnehmer am Treffen ein und erhalten das Ergebnis â die Trinkgeldsumme, die man lassen sollte.
Starten wir
Die vollstÀndige BenutzeroberflÀche der Anwendung sieht wie folgt aus:


Erster Schritt â . Ăffnen Sie es in Android Studio 3.0 oder einer neueren Version. Bauen Sie das Projekt und starten Sie es, und sehen Sie einen weiĂen Bildschirm. Alles in Ordnung, das sollte so sein.


Die Benutzeraktionen sind im Projekt in chronologischer Reihenfolge festgelegt, damit alles verstÀndlich ist. Um sie anzuzeigen, öffnen Sie Ansicht -> Werkzeugfenster -> TODO.
Wir untersuchen das Projekt und öffnen colors.xml zur Bewertung der Farbpalette. In strings.xml befinden sich die Textdaten (Beschriftungen), und in styles.xml gibt es einige Schriftvorlagen.
Entwicklung des Kostenabschnitts
Ăffnen Sie activity_main.xml und fĂŒgen Sie den untenstehenden Code in LinearLayout (#1) hinzu:
Jetzt können Sie den Stil des Verzeichnisses values anpassen oder mit Farben spielen, indem Sie .
Jetzt sieht das Projekt so aus:

Wie Sie sehen können, werden die Kosten anhand der Daten berechnet, die der Benutzer eingibt.
Entwicklung des Rechnungsabschnitts
FĂŒgen Sie den untenstehenden Code in LinearLayout nach dem Kostenabschnitt (#2) hinzu:
<! â TODO #3: Rechnungsabschnitt erstellen â
âŠWir schlieĂen das LinearLayout nach der TODO-Liste und fĂŒgen dann neuen Code hinzu, indem wir ihn innerhalb des LinearLayout (#3) platzieren:
Da die Hauptaufgabe der Anwendung darin besteht, die individuellen Ausgaben fĂŒr jeden der Teilnehmer im Restaurant zu berechnen, spielt costPerPersonTextView eine entscheidende Rolle.
EditText beschrÀnkt die Eingabe auf eine Zeile, dieser Parameter sollte den Wert NumberDecimal inputType haben.

Wir starten das Projekt zu Testzwecken und geben die Parameter des Gesamtschadens ein (z.B. zerbrochene Tassen, Teller usw.)
Entwicklung des Abschnitts âPersonen und Trinkgeldâ
Um die Auswahl der Trinkgeldhöhe hinzuzufĂŒgen, fĂŒgen wir den folgenden Code in den neuen Abschnitt LinearLayout (#4) ein:
Dieser Codeabschnitt ist notwendig fĂŒr die genaue Berechnung des Trinkgeldbetrags. Der Standardwert des Textes betrĂ€gt 20. Die ImageButtons sind mit Icons im schreibgeschĂŒtzten Ordner ausgestattet.
Wir kopieren den Abschnitt vollstĂ€ndig und fĂŒgen das Folgende hinzu (#5):
- ImageButton-IDs (subtractPeopleButton, addPeopleButton)
- TextView-IDs (numberOfPeopleStaticText, numberOfPeopleTextView)
- Standardtext fĂŒr numberOfPeopleTextView (sollte 4 sein).

Jetzt gibt es beim Start der Anwendung die Möglichkeit, den Rechnungsbetrag hinzuzufĂŒgen, die Tasten âHinzufĂŒgen/Verringerâ funktionieren auch, aber es passiert noch nichts.
Wir fĂŒgen Views hinzu
Ăffnen Sie MainActivity.kt und fĂŒgen Sie Folgendes in die Funktion initViews (#6) ein:
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: Binde die Buttons an den Listener
//TODO #16: Binde EditText an TextWatcher
}Wir vervollstÀndigen die Buttons
Um die KlickunterstĂŒtzung fĂŒr die Buttons hinzuzufĂŒgen, implementieren wir View.OnClickListener auf Klassenebene (#7):
class MainActivity: AppCompatActivity(), View.OnClickListener {
Das Projekt kann jetzt nicht kompiliert werden, da wir noch einige Schritte ausfĂŒhren mĂŒssen (#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()
}
} In Bezug auf Buttons und Schalter ist Kotlin wirklich groĂartig organisiert! FĂŒgen Sie den unten stehenden Code in alle Funktionen zum Inkrementieren und Dekrementieren ein
(#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()
}
}Hier schĂŒtzt der Code die Inkrementierungsfunktionen mit maximalen Werten (MAX_TIP & MAX_PEOPLE). DarĂŒber hinaus schĂŒtzt der Code die Dekrementierungsfunktionen mit minimalen Werten (MIN_TIP & MIN_PEOPLE).
Jetzt binden wir die Buttons an die Listener in der Funktion initViews (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Binde EditText an TextWatcher
} 
Jetzt können wir die Gesamtausgaben, Trinkgelder und die Anzahl der Teilnehmer an der Besprechung hinzufĂŒgen. Und jetzt das Wichtigste âŠ
Bereich zur Kostenaufstellung
Dieser Code berechnet die Ausgaben (#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)
}Hier wird eine Funktion aufgerufen, die es ermöglicht, die Anzahl der Personen in der Gruppe zu berĂŒcksichtigen und das Trinkgeld zu berechnen (#15):
private fun incrementTip() {
âŠ
}
private fun decrementTip() {
âŠ
}
private fun incrementPeople() {
âŠ
}
private fun decrementPeople() {
âŠ
}Wir starten die Anwendung. Sie sieht gut aus und funktioniert hervorragend. Aber es könnte noch besser sein.
Wenn Sie versuchen, den Betrag der Rechnung zu löschen und dann die Anzahl der Tipps oder Freunde zu erhöhen, wird die Anwendung abstĂŒrzen, da es noch keine ĂberprĂŒfung auf den Nullwert der Ausgaben gibt. DarĂŒber hinaus werden die Ausgaben nicht aktualisiert, wenn Sie versuchen, den Betrag der Rechnung zu Ă€ndern.
Letzte Schritte
Wir fĂŒgen einen TextWatcher hinzu (#16):
class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
Dann integrieren wir den Listener billEditText (#17):
billEditText.addTextChangedListener(this)
AuĂerdem fĂŒgen wir den Code fĂŒr die AusfĂŒhrung des TextWatchers hinzu (#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) {} 
Nun funktioniert alles einwandfrei! GlĂŒckwunsch, Sie haben Ihren eigenen âTip Rechnerâ in Kotlin geschrieben.

Skillbox empfiehlt:
- ZweijÀhriger praktischer Kurs .
- Online-Kurs .
- Praktischer Jahreskurs .
Quelle: habr.com
