рдХреЛрдЯрд▓рд┐рдирдорд╛ рдЯрд┐рдк рдХреНрдпрд╛рд▓рдХреБрд▓реЗрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ: рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рдХреЛрдЯрд▓рд┐рдирдорд╛ рдЯрд┐рдк рдХреНрдпрд╛рд▓рдХреБрд▓реЗрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ: рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ Kotlin рдорд╛ рд╕реБрдЭрд╛рд╡рд╣рд░реВ рдЧрдгрдирд╛ рдЧрд░реНрди рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕рд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдмрддрд╛рдЙрдБрдЫреМрдВред рдердк рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдХреЛрдЯрд▓рд┐рди 1.3.21, рдПрдиреНрдбреНрд░реЛрдЗрдб 4, рдПрдиреНрдбреНрд░реЛрдЗрдб рд╕реНрдЯреБрдбрд┐рдпреЛ 3ред рд▓реЗрдЦ рд░реЛрдЪрдХ рд╣реБрдиреЗрдЫ, рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рдПрдиреНрдбреНрд░реЛрдЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕рдорд╛ рдЖрдлреНрдиреЛ рдпрд╛рддреНрд░рд╛ рд╕реБрд░реБ рдЧрд░реНрдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ред рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рднрд┐рддреНрд░ рдХреЗ рд░ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗрд░ рдмреБрдЭреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рд░реЗрд╕реНрдЯреБрд░реЗрдиреНрдЯ рд╡рд╛ рдХреНрдпрд╛рдлреЗрдорд╛ рд╕рдордп рдмрд┐рддрд╛рдЙрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдиреЗ рдХрдореНрдкрдиреАрдмрд╛рдЯ рд╕реБрдЭрд╛рд╡рд╣рд░реВрдХреЛ рдорд╛рддреНрд░рд╛ рдЧрдгрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдБрджрд╛ рдпреЛ рдХреНрдпрд╛рд▓рдХреБрд▓реЗрдЯрд░ рдХрд╛рдордорд╛ рдЖрдЙрдиреЗрдЫред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╕рдмреИрд▓реЗ рд╕рдзреИрдВ рд╡реЗрдЯрд░рд╣рд░реВрд▓рд╛рдИ рдЯрд┐рдк рдЫреЛрдбреНрджреИрдирдиреН; рдпреЛ рдПрдХ рдкрд╢реНрдЪрд┐рдореА рдкрд░рдореНрдкрд░рд╛ рд╣реЛ, рддрд░ рдпрд╕реНрддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдиреИ рдкрдирд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд░реЛрдЪрдХ рдЫред

рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо "рдореЛрдмрд╛рдЗрд▓ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдкреНрд░реЛ.

рдпреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдЮреНрдЪрд╛рд▓рдирдорд╛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:

рдХреЛрдЯрд▓рд┐рдирдорд╛ рдЯрд┐рдк рдХреНрдпрд╛рд▓рдХреБрд▓реЗрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ: рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рддрдкрд╛рдИрдВрд▓реЗ рдХреБрд▓ рд░рдХрдордХреЛ рдЗрдЪреНрдЫрд┐рдд рдкреНрд░рддрд┐рд╢рдд, рдмреИрдардХ рд╕рд╣рднрд╛рдЧреАрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН - рддрдкрд╛рдИрдВрд▓реЗ рдЫреЛрдбреНрдиреБрдкрд░реНрдиреЗ рдЯрд┐рдкрдХреЛ рдорд╛рддреНрд░рд╛ред

рд╕реБрд░реБ рдЧрд░реНрджреИ

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

рдХреЛрдЯрд▓рд┐рдирдорд╛ рдЯрд┐рдк рдХреНрдпрд╛рд▓рдХреБрд▓реЗрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ: рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?

рдкрд╣рд┐рд▓реЛ рдХрд╛рд░реНрдп - рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЖрдзрд╛рд░ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрджреИред рдпрд╕рд▓рд╛рдИ рдПрдиреНрдбреНрд░реЛрдЗрдб рд╕реНрдЯреБрдбрд┐рдпреЛ 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 рдорд╛ рдердкреНрдиреБрд╣реЛрд╕реН:

<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 рдорд╛ рд╕реЗрдЯ рд╣реБрдиреБрдкрд░реНрдЫред

рдХреЛрдЯрд▓рд┐рдирдорд╛ рдЯрд┐рдк рдХреНрдпрд╛рд▓рдХреБрд▓реЗрдЯрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ: рдпрд╕рд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ?
рд╣рд╛рдореА рдкрд░реАрдХреНрд╖рдгрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ рд░ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖рддрд┐рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдЫреМрдВ (рдЯреБрдЯреЗрдХреЛ рдХрдк, рдкреНрд▓реЗрдЯрд╣рд░реВ, рдЖрджрд┐)ред

"рд╡реНрдпрдХреНрддрд┐ рд░ рд╕реБрдЭрд╛рд╡" рдЦрдгреНрдб рдХреЛ рд╡рд┐рдХрд╛рд╕

рдЯрд┐рдк рднреЛрд▓реНрдпреБрдо рдЪрдпрди рдердкреНрдирдХреЛ рд▓рд╛рдЧрд┐, рддрд▓рдХреЛ рдХреЛрдбрд▓рд╛рдИ рдирдпрд╛рдБ 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 рд╣реЛред рдЫрд╡рд┐ рдмрдЯрдирд╣рд░реВ рд▓реЗрдЦреНрдиреЗ рдЕрдиреБрдорддрд┐ рднрдПрдХреЛ рдлреЛрд▓реНрдбрд░рдорд╛ рдЖрдЗрдХрдирд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдиреНрдЫред

рдЦрдгреНрдб рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдирд┐рдореНрди рдердкреНрдиреБрд╣реЛрд╕реН (#5):

  • ImageButton ids (subtractPeopleButton, AddPeopleButton)
  • 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
 
}

рдмрдЯрдирд╣рд░реВ рд╕рдорд╛рдкреНрдд рдЧрд░реНрджреИ

рдмрдЯрди рдХреНрд▓рд┐рдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рдердкреНрди, рд╣рд╛рдореА рдХрдХреНрд╖рд╛ рд╕реНрддрд░ (#7) рдорд╛ View.OnClickListener рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВ:

рд╡рд░реНрдЧ рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐: 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(рдпреЛ)

рд╕рд╛рдереИ рд╣рд╛рдореА 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 рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди