БъздаванС Π½Π° ΠΊΠ°Π»ΠΊΡƒΠ»Π°Ρ‚ΠΎΡ€ Π·Π° бакшиши Π² Kotlin: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ?

БъздаванС Π½Π° ΠΊΠ°Π»ΠΊΡƒΠ»Π°Ρ‚ΠΎΡ€ Π·Π° бакшиши Π² Kotlin: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ?

ПоказвамС Π²ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ просто ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° изчисляванС Π½Π° бакшиши Π² Kotlin. Π—Π° Π΄Π° бъдСм ΠΏΠΎ-Ρ‚ΠΎΡ‡Π½ΠΈ, Kotlin 1.3.21, Android 4, Android Studio 3. Бтатията Ρ‰Π΅ бъдС интСрСсна ΠΏΡ€Π΅Π΄ΠΈ всичко Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π·Π°ΠΏΠΎΡ‡Π²Π°Ρ‚ своСто ΠΏΡŠΡ‚ΡƒΠ²Π°Π½Π΅ Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° прилоТСния Π·Π° Android. Позволява Π²ΠΈ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ Π²ΡŠΡ‚Ρ€Π΅ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ.

Вакъв ΠΊΠ°Π»ΠΊΡƒΠ»Π°Ρ‚ΠΎΡ€ Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π°Ρ‚ΠΎ трябва Π΄Π° изчислитС Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π±Π°ΠΊΡˆΠΈΡˆΠΈΡ‚Π΅ ΠΎΡ‚ компания, която Ρ€Π΅ΡˆΠΈ Π΄Π° ΠΏΡ€Π΅ΠΊΠ°Ρ€Π° Π²Ρ€Π΅ΠΌΠ΅ Π² рСсторант ΠΈΠ»ΠΈ ΠΊΠ°Ρ„Π΅Π½Π΅. Π Π°Π·Π±ΠΈΡ€Π° сС, Π½Π΅ всСки ΠΈ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ оставя Ρ‡Π°ΠΉ Π½Π° ΡΠ΅Ρ€Π²ΠΈΡ‚ΡŒΠΎΡ€ΠΈΡ‚Π΅, Ρ‚ΠΎΠ²Π° Π΅ ΠΏΠΎ-скоро Π·Π°ΠΏΠ°Π΄Π½Π° традиция, Π½ΠΎ ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅ Π½Π° Ρ‚Π°ΠΊΠΎΠ²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ във всСки случай Π΅ интСрСсСн.

НапомнямС Π²ΠΈ: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС във всСки курс Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ промоционалния ΠΊΠΎΠ΄ Π½Π° "Habr".

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"/>

Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° стилизиратС дирСкторията със стойности ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ³Ρ€Π°Π΅Ρ‚Π΅ с Ρ†Π²Π΅Ρ‚ΠΎΠ²Π΅, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ инструмСнт material.io.

Π‘Π΅Π³Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

БъздаванС Π½Π° ΠΊΠ°Π»ΠΊΡƒΠ»Π°Ρ‚ΠΎΡ€ Π·Π° бакшиши Π² Kotlin: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ?
ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, изчисляванСто Π½Π° Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ сС основава Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅, въвСдСни ΠΎΡ‚ потрСбитСля.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½Π΅ Π½Π° сСкцията Π·Π° Π°ΠΊΠ°ΡƒΠ½Ρ‚

Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ ΠΊΠΎΠ΄Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ към LinearLayout слСд сСкцията Π·Π° Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈ (#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 слСд списъка със Π·Π°Π΄Π°Ρ‡ΠΈ ΠΈ слСд Ρ‚ΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ новия ΠΊΠΎΠ΄, ΠΊΠ°Ρ‚ΠΎ Π³ΠΎ поставитС Π²ΡŠΡ‚Ρ€Π΅ Π² 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 (ΠΈΠ·Π²Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° PeopleButton, добавянС Π½Π° PeopleButton)
  • TextView ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ (numberOfPeopleStaticText, numberOfPeopleTextView)
  • ВСкст ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° numberOfPeopleTextView (трябва Π΄Π° бъдС 4).

БъздаванС Π½Π° ΠΊΠ°Π»ΠΊΡƒΠ»Π°Ρ‚ΠΎΡ€ Π·Π° бакшиши Π² Kotlin: ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚ΠΈ?

Π‘Π΅Π³Π° ΠΏΡ€ΠΈ стартиранС Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ възмоТно добавянС Π½Π° сумата ΠΏΠΎ Ρ„Π°ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π°, работят ΠΈ Π±ΡƒΡ‚ΠΎΠ½ΠΈΡ‚Π΅ ДобавянС / ИзваТданС, Π½ΠΎ засСга Π½ΠΈΡ‰ΠΎ Π½Π΅ сС случва.

Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ ΠΈΠ·Π³Π»Π΅Π΄ΠΈ

ΠžΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ 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):

клас 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: 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):

клас 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 ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°:

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€