Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

РассказываСм, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для расчСта Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° языкС Kotlin. Если Ρ‚ΠΎΡ‡Π½Π΅Π΅, Ρ‚ΠΎ Kotlin 1.3.21, Android 4, Android Studio 3. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ интСрСсной, Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ свой ΠΏΡƒΡ‚ΡŒ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Android-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Она позволяСт ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ прилоТСния.

Π’Π°ΠΊΠΎΠΉ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ пригодится, ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ сумму Ρ‡Π°Π΅Π²Ρ‹Ρ… с ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, Ρ€Π΅ΡˆΠΈΠ²ΡˆΠ΅ΠΉ провСсти врСмя Π² рСсторанС ΠΈΠ»ΠΈ ΠΊΠ°Ρ„Π΅. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ всС ΠΈ Π½Π΅ всСгда ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π½Ρ‚Π°ΠΌ Π½Π° Ρ‡Π°ΠΉ, это большС западная традиция, Π½ΠΎ процСсс Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‚Π°ΠΊΠΎΠ³ΠΎ прилоТСния Π² любом случаС интСрСсСн.

НапоминаСм: для всСх Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»Π΅ΠΉ Β«Π₯Π°Π±Ρ€Π°Β» β€” скидка 10 000 Ρ€ΡƒΠ±Π»Π΅ΠΉ ΠΏΡ€ΠΈ записи Π½Π° любой курс Skillbox ΠΏΠΎ ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄Ρƒ Β«Π₯Π°Π±Ρ€Β».

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ курс Β«ΠœΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ PRO.

Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π’Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ с ΠΎΠ±Ρ‰Π΅ΠΉ суммы, количСство участников встрСчи ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ β€” сумму Ρ‡Π°Π΅Π²Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ стоит ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ.

НачинаСм

ΠŸΠΎΠ»Π½Ρ‹ΠΉ интСрфСйс прилоТСния выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

ΠŸΠ΅Ρ€Π²ΠΎΠ΅ дСйствиС β€” Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° основы ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π΅Π΅ Π² Android Studio 3.0 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ вСрсии. Π‘Ρ‚Ρ€ΠΎΠΈΠΌ ΠΈ запускаСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Π±Π΅Π»Ρ‹ΠΉ экран. ВсС Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Ρ‚Π°ΠΊ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

ДСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ прописаны Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π² хронологичСском порядкС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Π±Ρ‹Π»ΠΎ понятно. Для Π΅Π³ΠΎ просмотра ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ View -> Tool Windows -> TODO.

Π˜Π·ΡƒΡ‡Π°Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ colors.xml для ΠΎΡ†Π΅Π½ΠΊΠΈ Ρ†Π²Π΅Ρ‚ΠΎΠ²ΠΎΠΉ ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρ‹. Π’ strings.xml Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ тСкстовыС Π΄Π°Π½Π½Ρ‹Π΅ (подписи), Π° Π² styles.xml Π΅ΡΡ‚ΡŒ нСсколько ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ²Ρ‹Ρ… шаблонов.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π°Π·Π΄Π΅Π»Π° Π·Π°Ρ‚Ρ€Π°Ρ‚

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ activity_main.xml ΠΈ добавляСм располоТСнный Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Π² LinearLayout (#1):

<TextView
    android_id="@+id/expensePerPersonTextView"
    android_layout_width="match_parent"
    android_layout_height="wrap_content"
    android_paddingTop="30dp"
    style="@style/h1Bold"
    android_textColor="@color/colorAccent"
    android_text="0"/>
 
<TextView
    android_layout_width="match_parent"
    android_layout_height="wrap_content"
    android_paddingBottom="25dp"
    style="@style/h2"
    android_textColor="@color/colorAccent"
    android_text="@string/perPersonStaticText"/>

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΡ‚ΠΈΠ»ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ values ΠΈΠ»ΠΈ ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ с Ρ†Π²Π΅Ρ‚Π°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ инструмСнт material.io.

БСйчас ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ выглядит Ρ‚Π°ΠΊ:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?
Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, расчСт Π·Π°Ρ‚Ρ€Π°Ρ‚ производится ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вносит ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π°Π·Π΄Π΅Π»Π° счСтов

ДобавляСм ΠΊΠΎΠ΄, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅, Π² LinearLayout послС Expense Section (#2):

<LinearLayout
    android_layout_width="match_parent"
    android_layout_height="match_parent"
    android_orientation="vertical"
    android_background="@color/colorAccent">
 
<! β€” TODO #3: Build Bill Section β†’
 
… 
</LinearLayout>

Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ LinearLayout послС списка TODOs, Π° Π·Π°Ρ‚Π΅ΠΌ добавляСм Π½ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄, размСщая Π΅Π³ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ LinearLayout (#3):

<TextView
      android_layout_margin="15dp"
      android_layout_width="match_parent"
      android_layout_height="wrap_content"
      android_textColor="@color/colorWhite"
      style="@style/h4"
      android_text="@string/billStaticText"/>
 
<EditText
      android_id="@+id/billEditText"
      android_layout_width="match_parent"
      android_layout_height="wrap_content"
      android_textColor="@color/colorWhite"
      android_inputType="numberDecimal"
      android_maxLines="1"
      style="@style/h2Bold"
      android_text="0"/>

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ главная Π·Π°Π΄Π°Ρ‡Π° прилоТСния β€” расчСт ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Ρ‚Ρ€Π°Ρ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· участников посидСлок Π² рСсторанС, Ρ‚ΠΎ основноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚ costPerPersonTextView.

EditText ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π²Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ΄Π½ΠΎΠΉ строкой, Ρƒ этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NumberDecimal inputType.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?
ЗапускаСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ для тСста ΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΡƒΡ‰Π΅Ρ€Π±Π° (Ρ€Π°Π·Π±ΠΈΡ‚Ρ‹Π΅ Ρ‡Π°ΡˆΠΊΠΈ, Ρ‚Π°Ρ€Π΅Π»ΠΊΠΈ ΠΈ Ρ‚.ΠΏ.)

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π°Π·Π΄Π΅Π»Π° Β«Π›ΡŽΠ΄ΠΈ ΠΈ Ρ‡Π°Π΅Π²Ρ‹Π΅Β»

Π§Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€Π° объСма Ρ‡Π°Π΅Π²Ρ‹Ρ…, вставляСм располоТСнный Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Π² Π½ΠΎΠ²ΡƒΡŽ ΡΠ΅ΠΊΡ†ΠΈΡŽ LinearLayout (#4):

<TextView
      android_layout_margin="15dp"
      android_layout_width="match_parent"
      android_layout_height="wrap_content"
      android_textColor="@color/colorWhite"
      style="@style/h4"
      android_text="@string/tipStaticText"/>
 
<LinearLayout
      android_layout_width="match_parent"
      android_layout_height="wrap_content"
      android_orientation="horizontal">
 
<ImageButton
        android_id="@+id/subtractTipButton"
        style="@style/operationButton"
        android_layout_marginLeft="20dp"
        android_layout_marginStart="20dp"
        android_src="@drawable/subtract"/>
 
<TextView
        android_id="@+id/tipTextView"
        android_layout_margin="15dp"
        android_layout_width="0dp"
        android_layout_height="wrap_content"
        android_textColor="@color/colorWhite"
        android_layout_weight="1"
        style="@style/h2Bold"
        android_text="20%"/>
 
<ImageButton
        android_id="@+id/addTipButton"
        style="@style/operationButton"
        android_layout_marginEnd="20dp"
        android_layout_marginRight="20dp"
        android_src="@drawable/add"/>
 
</LinearLayout>

Π­Ρ‚ΠΎΡ‚ участок ΠΊΠΎΠ΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Ρ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ расчСта суммы Ρ‡Π°Π΅Π²Ρ‹Ρ…. Π”Π΅Ρ„ΠΎΠ»Ρ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ тСкста β€” 20. ImageButtons снабТСны ΠΈΠΊΠΎΠ½ΠΊΠ°ΠΌΠΈ Π² ΠΏΠ°ΠΏΠΊΠ΅ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ записи.

ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π°Π·Π΄Π΅Π» ΠΈ добавляСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ (#5):

  • ImageButton ids (subtractPeopleButton, addPeopleButton)
  • TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)
  • DefaultText для numberOfPeopleTextView (Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ 4).

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈ запускС прилоТСния Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сумму счСта, Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΊΠ½ΠΎΠΏΠΊΠΈ Β«Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ/Π’Ρ‹Ρ‡Π΅ΡΡ‚ΡŒΒ», Π½ΠΎ ΠΏΠΎΠΊΠ° Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ происходит.

ДобавляСм 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: Bind Buttons to Listener
 
//TODO #16: Bind EditText to 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: Bind EditText to TextWatcher
}

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠΉ ΡƒΡ‰Π΅Ρ€Π±, Ρ‡Π°Π΅Π²Ρ‹Π΅ ΠΈ количСство участников встрСчи. Ну ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ самоС главноС…

Π Π°Π·Π΄Π΅Π» подсчСта Π·Π°Ρ‚Ρ€Π°Ρ‚

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ подсчитываСт Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ (#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: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Ну Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС! ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΡŽ, Π²Ρ‹ написали собствСнный Β«ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ Ρ‡Π°Π΅Π²Ρ‹Ρ…Β» Π½Π° Kotlin.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° Ρ‡Π°Π΅Π²Ρ‹Ρ… Π½Π° Kotlin: ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚?

Skillbox Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com