рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдХреЛрдЯрд▓рд┐рдирдордзреАрд▓ рдЯрд┐рдкрд╛рдВрдЪреА рдЧрдгрдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдзрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕рд╛ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рддреЗ рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧрддреЛ. рдЕрдзрд┐рдХ рддрдВрддреЛрддрдВрдд, Kotlin 1.3.21, Android 4, Android рд╕реНрдЯреБрдбрд┐рдУ 3. рд▓реЗрдЦ рдордиреЛрд░рдВрдЬрдХ рдЕрд╕реЗрд▓, рд╕рд░реНрд╡ рдкреНрд░рдердо, рдЬреЗ Android рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕рд╛рдд рддреНрдпрд╛рдВрдЪрд╛ рдкреНрд░рд╡рд╛рд╕ рд╕реБрд░реВ рдХрд░рдд рдЖрд╣реЗрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА. рд╣реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдордзреНрдпреЗ рдХрд╛рдп рдЖрдгрд┐ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.

рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдЦрд╛рджреНрдпрд╛ рд░реЗрд╕реНрдЯреЙрд░рдВрдЯ рдХрд┐рдВрд╡рд╛ рдХреЕрдлреЗрдордзреНрдпреЗ рд╡реЗрд│ рдШрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрдгрд╛рд▒реНрдпрд╛ рдХрдВрдкрдиреАрдХрдбреВрди рдЯрд┐рдкреНрд╕рдЪреА рд░рдХреНрдХрдо рдореЛрдЬрд╛рдпрдЪреА рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ рд╣реЗ рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рдЙрдкрдпреЛрдЧреА рдкрдбреЗрд▓. рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХрдЬрдг рдиреЗрд╣рдореА рд╡реЗрдЯрд░реНрд╕рдирд╛ рдЯрд┐рдк рджреЗрдд рдирд╛рд╣реА; рд╣реА рдПрдХ рдкрд╛рд╢реНрдЪрд╛рддреНрдп рдкрд░рдВрдкрд░рд╛ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЕрд╢рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ.

рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕ "рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░ PRO.

рд╣реЗ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрд╢рдирдордзреНрдпреЗ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдЖрдкрдг рдПрдХреВрдг рд░рдХрдореЗрдЪреА рдЗрдЪреНрдЫрд┐рдд рдЯрдХреНрдХреЗрд╡рд╛рд░реА, рдореАрдЯрд┐рдВрдЧрдордзреАрд▓ рд╕рд╣рднрд╛рдЧреАрдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рд╛ рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдо рдорд┐рд│рд╡рд╛ - рдЖрдкрдг рд╕реЛрдбрд▓реЗрд▓реНрдпрд╛ рдЯреАрдкрдЪреА рд░рдХреНрдХрдо.

рдкреНрд░рд╛рд░рдВрдн рдХрд░рдгреЗ

рд╕рдВрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрд╕реЗ рджрд┐рд╕рддреЗ:
рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдкрд╣рд┐рд▓реА рдХреГрддреА - рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмреЗрд╕ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдд рдЖрд╣реЗ. рддреЗ Android Studio 3.0 рдХрд┐рдВрд╡рд╛ рдирдВрддрд░рдЪреНрдпрд╛ рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдЙрдШрдбрд╛. рдЖрдореНрд╣реА рдкреНрд░рдХрд▓реНрдк рддрдпрд╛рд░ рдХрд░рддреЛ рдЖрдгрд┐ рд▓реЙрдиреНрдЪ рдХрд░рддреЛ рдЖрдгрд┐ рдПрдХ рдкрд╛рдВрдврд░рд╛ рд╕реНрдХреНрд░реАрди рдкрд╛рд╣рддреЛ. рд╕рд░реНрд╡ рдХрд╛рд╣реА рдареАрдХ рдЖрд╣реЗ, рддреЗ рдХрд╕реЗ рдЕрд╕рд╛рд╡реЗ.

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕реНрдкрд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдХреГрддреА рдкреНрд░рдХрд▓реНрдкрд╛рдордзреНрдпреЗ рдХрд╛рд▓рдХреНрд░рдорд╛рдиреБрд╕рд╛рд░ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдЖрд╣реЗрдд. рддреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА, 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 рд╕рд╛рдзрди.

рдЖрддрд╛ рдкреНрд░рдХрд▓реНрдк рдЕрд╕реЗ рджрд┐рд╕рддреЗ:

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?
рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЦрд░реНрдЪрд╛рдЪреА рдЧрдгрдирд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ.

рд▓реЗрдЦрд╛ рд╡рд┐рднрд╛рдЧрд╛рдЪрд╛ рд╡рд┐рдХрд╛рд╕

рдЦрд░реНрдЪ рд╡рд┐рднрд╛рдЧ (#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>

рдЖрдореНрд╣реА TODOs рдЪреНрдпрд╛ рд╕реВрдЪреАрдирдВрддрд░ 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 рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?
рдЖрдореНрд╣реА рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдкреНрд░рдХрд▓реНрдк рд▓рд╛рдБрдЪ рдХрд░рддреЛ рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдп рдиреБрдХрд╕рд╛рди (рддреБрдЯрд▓реЗрд▓реЗ рдХрдк, рдкреНрд▓реЗрдЯреНрд╕ рдЗ.) рд╕рд╛рдареА рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рддреЛ.

"рд▓реЛрдХ рдЖрдгрд┐ рдЯрд┐рдкрд╛" рд╡рд┐рднрд╛рдЧрд╛рдЪрд╛ рд╡рд┐рдХрд╛рд╕

рдЯрд┐рдк рд╡реНрд╣реЙрд▓реНрдпреВрдо рдирд┐рд╡рдб рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА, рдЦрд╛рд▓реАрд▓ рдХреЛрдб рдирд╡реАрди рд▓рд┐рдирд┐рдпрд░рд▓реЗрдЖрдЙрдЯ рд╡рд┐рднрд╛рдЧрд╛рдд рдкреЗрд╕реНрдЯ рдХрд░рд╛ (#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 рдЖрд╣реЗ. рд▓реЗрдЦрди рдкрд░рд╡рд╛рдирдЧреА рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рдкреНрд░рддрд┐рдорд╛ рдмрдЯрдгреЗ рдЪрд┐рдиреНрд╣рд╛рдВрд╕рд╣ рдкреНрд░рджрд╛рди рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд.

рд╡рд┐рднрд╛рдЧ рдкреВрд░реНрдгрдкрдгреЗ рдХреЙрдкреА рдХрд░рд╛ рдЖрдгрд┐ рдЦрд╛рд▓реАрд▓ (#5) рдЬреЛрдбрд╛:

  • рдЗрдореЗрдЬ рдмрдЯрдг рдЖрдпрдбреА (рд╡рдЬрд╛рдмрд╛рдХреА рд▓реЛрдХ рдмрдЯрдг, рд▓реЛрдХ рдмрдЯрдг рдЬреЛрдбрд╛)
  • TextView ids(numberOfPeopleStaticText, numberOfPeopleTextView)
  • numberOfPeopleTextView рд╕рд╛рдареА рдбреАрдлреЙрд▓реНрдЯ рдЯреЗрдХреНрд╕реНрдЯ (4 рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ).

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдЖрддрд╛, рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд╛рдБрдЪ рдХрд░рддрд╛, рддреЗрд╡реНрд╣рд╛ рдЗрдирд╡реНрд╣реЙрдЗрд╕рдЪреА рд░рдХреНрдХрдо рдЬреЛрдбрдгреНрдпрд╛рдЪреА рд╕рдВрдзреА рдЕрд╕рддреЗ, "рдЬреЛрдбрд╛/рд╡рдЬрд╛ рдХрд░рд╛" рдмрдЯрдгреЗ рджреЗрдЦреАрд▓ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд, рдкрд░рдВрддреБ рдЕрджреНрдпрд╛рдк рдХрд╛рд╣реАрд╣реА рдЭрд╛рд▓реЗ рдирд╛рд╣реА.

рджреГрд╢реНрдпреЗ рдЬреЛрдбрдд рдЖрд╣реЗ

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):

рд╡рд░реНрдЧ рдореБрдЦреНрдп рдХреНрд░рд┐рдпрд╛рдХрд▓рд╛рдк: 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()
        }
    }

рдмрдЯрдгреЗ рдЖрдгрд┐ рд╕реНрд╡рд┐рдЪреЗрд╕рдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдХреЛрдЯрд▓рд┐рди рд╕рд░реНрд╡рдХрд╛рд╣реА рдЕрддрд┐рд╢рдп рдЫрд╛рди рдЖрдпреЛрдЬрд┐рдд рдХрд░рддреЗ! рд╕рд░реНрд╡ рд╡рд╛рдв рдЖрдгрд┐ рдШрдЯ рдлрдВрдХреНрд╢рдиреНрд╕рдордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдХреЛрдб рдЬреЛрдбрд╛
(#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
}

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рддреБрдореНрд╣реА рдЖрддрд╛ рдПрдХреВрдг рдиреБрдХрд╕рд╛рди, рдЯрд┐рдкрд╛ рдЖрдгрд┐ рдореАрдЯрд┐рдВрдЧ рд╕рд╣рднрд╛рдЧреАрдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбреВ рд╢рдХрддрд╛. рдмрд░рдВ, рдЖрддрд╛ рд╕рд░реНрд╡рд╛рдд рдорд╣рддреНрддреНрд╡рд╛рдЪреА рдЧреЛрд╖реНрдЯ...

рдЦрд░реНрдЪ рдЧрдгрдирд╛ рд╡рд┐рднрд╛рдЧ

рд╣рд╛ рдХреЛрдб рдЦрд░реНрдЪрд╛рдЪреА рдЧрдгрдирд╛ рдХрд░рддреЛ (#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):

рд╡рд░реНрдЧ рдореБрдЦреНрдп рдХреНрд░рд┐рдпрд╛рдХрд▓рд╛рдк: AppCompatActivity(), View.OnClickListener, TextWatcher {

рдордЧ рдЖрдореНрд╣реА billEditText рд╢реНрд░реЛрддрд╛ (#17) рдПрдореНрдмреЗрдб рдХрд░рддреЛ:

billEditText.addTextChangedListener(рд╣реЗ)

рддрд╕реЗрдЪ рдЖрдореНрд╣реА рдЯреЗрдХреНрд╕реНрдЯрд╡реЙрдЪрд░ (#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) {}

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рдмрд░рдВ, рдЖрддрд╛ рдкреВрд░реНрдгрдкрдгреЗ рд╕рд░реНрд╡рдХрд╛рд╣реА рдХрд╛рд░реНрдп рдХрд░рддреЗ! рдЕрднрд┐рдирдВрджрди, рддреБрдореНрд╣реА рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ тАЬрдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░тАЭ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ.

рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рддрдпрд╛рд░ рдХрд░рдгреЗ: рддреЗ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ?

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛