
Π Π°Π·ΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Π±Π°ΠΊΡΠΈΡ Π½Π° Π΅Π·ΠΈΠΊΠ° Kotlin. ΠΠΎ-ΡΠΎΡΠ½ΠΎ, ΡΡΠ³Π»Π°ΡΠ½ΠΎ Kotlin 1.3.21, Android 4, Android Studio 3. Π‘ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΠΏΡΠ΅Π΄ΠΈ Π²ΡΠΈΡΠΊΠΎ Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Π·Π°ΠΏΠΎΡΠ²Π°Ρ ΡΠ²ΠΎΡ ΠΏΡΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Android ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π’Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Π²ΡΡΡΠ΅ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
Π’Π°ΠΊΡΠ² ΠΊΠ°Π»ΠΊΡΠ»Π°ΡΠΎΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠΌΠ΅ΡΠ½Π΅ ΠΎΠ±ΡΠ°ΡΠ° ΡΡΠΌΠ° Π½Π° Π±Π°ΠΊΡΠΈΡΠΈΡΠ΅ Π·Π° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, ΡΠ΅ΡΠΈΠ»Π° Π΄Π° ΠΏΡΠ΅ΠΊΠ°ΡΠ° Π²ΡΠ΅ΠΌΠ΅ Π² ΡΠ΅ΡΡΠΎΡΠ°Π½Ρ ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ΅. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½Π΅ Π²ΡΠΈΡΠΊΠΈ ΠΈ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΎΡΡΠ°Π²ΡΡ Π±Π°ΠΊΡΠΈΡ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΡΠΎΡΠΈΡΠ΅, ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-ΡΠΊΠΎΡΠΎ Π·Π°ΠΏΠ°Π΄Π½Π° ΡΡΠ°Π΄ΠΈΡΠΈΡ, Π½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ°ΠΊΠΎΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π²ΡΠΈΡΠΊΠΎ.
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° Β«Π₯Π°Π±ΡΠ°Β» β ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox Ρ ΠΏΡΠΎΠΌΠΎΠΊΠΎΠ΄ Β«Π₯Π°Π±ΡΒ».
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ .
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π² ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΡΠ°Π±ΠΎΡΠ°:

ΠΡΠ²Π΅Π΄Π΅ΡΠ΅ ΠΆΠ΅Π»Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Π½Ρ ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ° ΡΡΠΌΠ°, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠ½ΠΈΡΠΈ Π² ΡΡΠ΅ΡΠ°ΡΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° β ΡΡΠΌΠ°ΡΠ° Π½Π° Π±Π°ΠΊΡΠΈΡΠΈΡΠ΅, ΠΊΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΡΠ°Π²ΠΈ.
ΠΠ°ΠΏΠΎΡΠ²Π°ΠΌΠ΅
Π¦Π΅Π»ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:


ΠΡΡΠ²ΠΎΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ β ΠΠ΅ΠΉΡΡΠ²ΠΈΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² Ρ
ΡΠΎΠ½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅Π½ ΡΠ΅Π΄, Π·Π° Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠΈΡΠΊΠΎ ΡΡΠ½ΠΎ. ΠΠ° Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΎΡΠ²ΠΎΡΠ΅ΡΠ΅ View -> Tool Windows -> TODO.


ΠΠ·ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΠΎΡΠ²Π°ΡΡΠΌΠ΅ colors.xml, Π·Π° Π΄Π° ΠΎΡΠ΅Π½ΠΈΠΌ ΡΠ²Π΅ΡΠ½Π°ΡΠ° ΠΏΠ°Π»ΠΈΡΡΠ°. Π strings.xml ΡΠ° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ (Π½Π°Π΄ΠΏΠΈΡΠΈ), Π° Π² styles.xml ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°Π±Π»ΠΎΠ½Π° Π·Π° ΡΡΠΈΡΡΠΎΠ²Π΅.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ°Π·Π΄Π΅Π»Π° Π·Π° ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ.
ΠΡΠ²Π°ΡΡΠΌΠ΅ activity_main.xml ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π² LinearLayout (#1):
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΡΡΠΈΠ»Π° Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° values ΠΈΠ»ΠΈ Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Ρ ΡΠ²Π΅ΡΠΎΠ²Π΅ΡΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° material.io. .
ΠΠ°ΠΊ Π²ΠΈΠΆΠ΄Π°ΡΠ΅, ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ.

Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ°Π·Π΄Π΅Π»Π° Π·Π° ΡΠΌΠ΅ΡΠΊΠΈ.
ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΊΠΎΠ΄Π°, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, Π² LinearLayout ΡΠ»Π΅Π΄ ΡΠ°Π·Π΄Π΅Π»Π° Π·Π° ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ (#2):
<! β TODO #3: Build Bill Section ββ¦
ΠΠ°ΡΠ²Π°ΡΡΠΌΠ΅ LinearLayout ΡΠ»Π΅Π΄ ΡΠΏΠΈΡΡΠΊΠ° TODOs ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Π½ΠΎΠ² ΠΊΠΎΠ΄, ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π²ΡΡΡΠ΅ Π² LinearLayout (#3):ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π·Π°Π΄Π°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»Π½ΠΈΡΠ΅ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΡΡΠ°ΡΡΠ½ΠΈΠΊ Π² ΡΠ΅ΡΡΠΎΡΠ°Π½ΡΡΠΊΠΈΡΠ΅ Π½Π°Π²ΠΈΡΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ° costPerPersonTextView.
EditText ΠΎΠ³ΡΠ°Π½ΠΈΡΠ°Π²Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π½Π½ΠΈ Π΄ΠΎ Π΅Π΄ΠΈΠ½ ΡΠ΅Π΄, Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΡΠΎΠ·ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ NumberDecimal inputType.

Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π° ΡΠ΅ΡΡ ΠΈ Π²ΡΠ²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΠΎΠ±ΡΠΈΡΠ΅ ΡΠ΅ΡΠΈ (ΡΠ°Π·Π±ΠΈΡΠΈ ΡΠ°ΡΠΈ, ΡΠΈΠ½ΠΈΠΈ ΠΈ Ρ.Π½.)
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ°Π·Π΄Π΅Π»Π° βΠ₯ΠΎΡΠ° ΠΈ Π±Π°ΠΊΡΠΈΡΠΈβ
ΠΠ° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡΠΈΡ Π·Π° ΠΎΠ±Π΅ΠΌ Π½Π° Π±Π°ΠΊΡΠΈΡΠΈΡΠ΅, Π²ΠΌΡΠΊΠ²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π² Π½ΠΎΠ²ΠΈΡ LinearLayout (#4):
Π’ΠΎΠ·ΠΈ Π±Π»ΠΎΠΊ ΠΊΠΎΠ΄ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π·Π° ΡΠΎΡΠ΅Π½ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠΌΠ°ΡΠ° Π½Π° Π±Π°ΠΊΡΠΈΡΠΈΡΠ΅. ΠΠ΅ΡΠΎΠ»ΡΠ½Π°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ Π½Π° ΡΠ΅ΠΊΡΡΠ° Π΅ 20. ImageButtons ΡΠ° ΡΠ½Π°Π±Π΄Π΅Π½ΠΈ Ρ ΠΈΠΊΠΎΠ½ΠΊΠΈ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Ρ ΠΏΡΠ°Π²Π° Π·Π° Π·Π°ΠΏΠΈΡ.
ΠΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ (#5):
- ImageButton ids (subtractPeopleButton, addPeopleButton)
- TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)
- DefaultText Π·Π° numberOfPeopleTextView (ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ 4).

Π‘Π΅Π³Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠΌΠ°ΡΠ° Π½Π° ΡΠΌΠ΅ΡΠΊΠ°ΡΠ°, Π° Π±ΡΡΠΎΠ½ΠΈΡΠ΅ βΠΠΎΠ±Π°Π²ΠΈ/ΠΠ·Π²Π°Π΄ΠΈβ ΡΠ°Π±ΠΎΡΡΡ, Π½ΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½ΠΈΡΠΎ Π½Π΅ ΡΠ΅ ΡΠ»ΡΡΠ²Π°.
ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ Views
ΠΡΠ²Π°ΡΡΠΌΠ΅ MainActivity.kt ΠΈ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠΎΠ²Π° Π² ΡΡΠ½ΠΊΡΠΈΡΡΠ° 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: Π‘Π²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° Π±ΡΡΠΎΠ½ΠΈΡΠ΅ Ρ Listener
//TODO #16: Π‘Π²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° EditText Ρ TextWatcher
}ΠΠ°Π²ΡΡΡΠ²Π°ΠΌΠ΅ Π±ΡΡΠΎΠ½ΠΈΡΠ΅
ΠΠ° Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΠΊΠ»ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° Π±ΡΡΠΎΠ½ΠΈΡΠ΅, Π²Π½Π΅Π΄ΡΡΠ²Π°ΠΌΠ΅ View.OnClickListener Π½Π° Π½ΠΈΠ²ΠΎ ΠΊΠ»Π°Ρ (#7):
class MainActivity: AppCompatActivity(), View.OnClickListener {
ΠΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²ΡΡΡΠΈΠΌ ΠΎΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ (#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()
}
} Π ΡΠ°ΡΡΡΠ° Ρ Π±ΡΡΠΎΠ½ΠΈΡΠ΅ ΠΈ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°ΡΠ΅Π»ΠΈΡΠ΅ Kotlin Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½ΠΎ! ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π² Π²ΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ increment ΠΈ decrement
(#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()
}
}Π’ΡΠΊ ΠΊΠΎΠ΄ΡΡ Π·Π°ΡΠΈΡΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π·Π° ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½Ρ Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ (MAX_TIP & MAX_PEOPLE). ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΊΠΎΠ΄ΡΡ Π·Π°ΡΠΈΡΠ°Π²Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π·Π° Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½Ρ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ (MIN_TIP & MIN_PEOPLE).
Π‘Π΅Π³Π° ΡΠ²ΡΡΠ·Π²Π°ΠΌΠ΅ Π±ΡΡΠΎΠ½ΠΈΡΠ΅ Ρ ΡΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ Π² ΡΡΠ½ΠΊΡΠΈΡΡΠ° initViews (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: Π‘Π²ΡΡΠΆΠΈ EditText Ρ TextWatcher
} 
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΎΠ±ΡΠΈΡ ΡΠ°Π·Ρ
ΠΎΠ΄, Π±Π°ΠΊΡΠΈΡΠΈΡΠ΅ ΠΈ Π±ΡΠΎΡ Π½Π° ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π² ΡΡΠ΅ΡΠ°ΡΠ°. Π Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ...
Π Π°Π·Π΄Π΅Π» Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅
Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅ (#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)
}Π ΡΡΠΊ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ ΠΎΡΡΠ΅ΡΠ΅ Π±ΡΠΎΡ Π½Π° Ρ ΠΎΡΠ°ΡΠ° Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΡΠ° ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΡ Π±Π°ΠΊΡΠΈΡΠΈΡΠ΅ (#15):
private fun incrementTip() {
β¦
}
private fun decrementTip() {
β¦
}
private fun incrementPeople() {
β¦
}
private fun decrementPeople() {
β¦
}Π‘ΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ. ΠΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΈ ΡΠ°Π±ΠΎΡΠΈ ΠΎΡΠ»ΠΈΡΠ½ΠΎ. ΠΠΎ ΠΌΠΎΠΆΠ΅ ΠΈ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅.
ΠΠΊΠΎ ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π΅ΡΠ΅ ΡΡΠΌΠ°ΡΠ° Π½Π° ΡΠΌΠ΅ΡΠΊΠ°ΡΠ° ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄Π° ΡΠ²Π΅Π»ΠΈΡΠΈΡΠ΅ Π±ΡΠΎΡ Π½Π° Π±Π°ΠΊΡΠΈΡΠΈΡΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠΈΡΡΠ΅Π»ΠΈΡΠ΅, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΡΡΠΈΠ½Π΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π° Π½ΡΠ»Π΅Π²ΠΈ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈ. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, Π°ΠΊΠΎ ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΡΠΌΠ°ΡΠ° Π½Π° ΡΠΌΠ΅ΡΠΊΠ°ΡΠ°, ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅ Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ.
Π€ΠΈΠ½Π°Π»Π½ΠΈ ΡΡΡΠΏΠΊΠΈ
ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ TextWatcher (#16):
class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²Π½Π΅Π΄ΡΡΠ²Π°ΠΌΠ΅ ΡΠ»ΡΡΠ°ΡΠ΅Π»Ρ billEditText (#17):
billEditText.addTextChangedListener(this)
Π‘ΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΊΠΎΠ΄ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° 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) {} 
Π ΡΠ΅Π³Π° Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ! ΠΠΎΠ·Π΄ΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ "ΠΠ°Π»ΠΊΡΠ»Π°ΡΠΎΡ Π½Π° Π±Π°ΠΊΡΠΈΡΠΈ" Π½Π° Kotlin.

Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°:
- ΠΠ²ΡΠ³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ .
- ΠΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ .
- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΊΡΡΡ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
