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

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


ΠΡΡΠ²ΠΎΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ β . ΠΡΠ²Π°ΡΡΠΌΠ΅ Ρ Π² Android Studio 3.0 ΠΈΠ»ΠΈ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ. ΠΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΌΠ΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π±ΡΠ» Π΅ΠΊΡΠ°Π½. ΠΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄, ΡΠ°ΠΊΠ° ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅.


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

ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΡΠ΅, ΡΠ°Π·Ρ
ΠΎΠ΄ΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Ρ Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ Π²ΡΠ²Π΅ΠΆΠ΄Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ°Π·Π΄Π΅Π»Π° ΡΠΌΠ΅ΡΠΊΠΈ
ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΊΠΎΠ΄Π°, ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, Π² LinearLayout ΡΠ»Π΅Π΄ Expense Section (#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: Π‘Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ ΡΠ»ΡΡΠ°ΡΠ΅Π»Π΅ΠΌ
//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 Π²ΡΠΈΡΠΊΠΎ Π΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠ±ΡΠ΅! ΠΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π²ΡΠ² Π²ΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ ΠΈ Π½Π°ΠΌΠ°Π»ΡΠ²Π°Π½Π΅
(#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
