เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เช…เชฎเซ‡ เชคเชฎเชจเซ‡ เช•เชนเซ€เช เช›เซ€เช เช•เซ‡ เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชชเซเชธเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชเช• เชธเชฐเชณ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซ€. เชตเชงเซ เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡, เช•เซ‹เชŸเชฒเชฟเชจ 1.3.21, เชเชจเซเชกเซเชฐเซ‹เช‡เชก 4, เชเชจเซเชกเซเชฐเซ‹เช‡เชก เชธเซเชŸเซเชกเชฟเชฏเซ‹ 3. เช† เชฒเซ‡เช– เชฐเชธเชชเซเชฐเชฆ เชฐเชนเซ‡เชถเซ‡, เชธเซŒ เชชเซเชฐเชฅเชฎ, เชœเซ‡เช“ เชเชจเซเชกเซเชฐเซ‹เช‡เชก เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸเชฎเชพเช‚ เชคเซ‡เชฎเชจเซ€ เชฎเซเชธเชพเชซเชฐเซ€ เชถเชฐเซ‚ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ‡. เชคเซ‡ เชคเชฎเชจเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ€ เช…เช‚เชฆเชฐ เชถเซเช‚ เช…เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เช† เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชคเซเชฏเชพเชฐเซ‡ เช•เชพเชฎเชฎเชพเช‚ เช†เชตเชถเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเชพเชฐเซ‡ เชฐเซ‡เชธเซเชŸเซ‹เชฐเชจเซเชŸ เช…เชฅเชตเชพ เช•เซ‡เชซเซ‡เชฎเชพเช‚ เชธเชฎเชฏ เชตเชฟเชคเชพเชตเชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเชคเซ€ เช•เช‚เชชเชจเซ€เชจเซ€ เชŸเซ€เชชเซเชธเชจเซ€ เชฐเช•เชฎเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ. เช…เชฒเชฌเชคเซเชค, เชฆเชฐเซ‡เช• เชœเชฃ เชนเช‚เชฎเซ‡เชถเชพ เชตเซ‡เช‡เชŸเชฐเซเชธเชจเซ‡ เชŸเซ€เชช เช›เซ‹เชกเชคเซเช‚ เชจเชฅเซ€; เช† เชเช• เชชเชถเซเชšเชฟเชฎเซ€ เชชเชฐเช‚เชชเชฐเชพ เช›เซ‡, เชชเชฐเช‚เชคเซ เช†เชตเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชตเชฟเช•เชธเชพเชตเชตเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เซ‹เชˆเชชเชฃ เชธเช‚เชœเซ‹เช—เซ‹เชฎเชพเช‚ เชฐเชธเชชเซเชฐเชฆ เช›เซ‡.

เช…เชฎเซ‡ เชฏเชพเชฆ เช•เชฐเชพเชตเซ€เช เช›เซ€เช: Habrเชจเชพ เชคเชฎเชพเชฎ เชตเชพเชšเช•เซ‹ เชฎเชพเชŸเซ‡ - Habr เชชเซเชฐเซ‹เชฎเซ‹ เช•เซ‹เชกเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เช•เซ‹เชฐเซเชธเชฎเชพเช‚ เชจเซ‹เช‚เชงเชฃเซ€ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ 10 เชฐเซ‚เชฌเชฒ เชกเชฟเชธเซเช•เชพเช‰เชจเซเชŸ.

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡: เชชเซเชฐเซ‡เช•เซเชŸเชฟเช•เชฒ เช•เซ‹เชฐเซเชธ "เชฎเซ‹เชฌเชพเช‡เชฒ เชกเซ‡เชตเชฒเชชเชฐ เชชเซเชฐเซ‹.

เช“เชชเชฐเซ‡เชถเชจเชฎเชพเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช†เชจเชพ เชœเซ‡เชตเซ€ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:

เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เชคเชฎเซ‡ เช•เซเชฒ เชฐเช•เชฎเชจเซ€ เช‡เชšเซเช›เชฟเชค เชŸเช•เชพเชตเชพเชฐเซ€, เชฎเซ€เชŸเชฟเช‚เช—เชฎเชพเช‚ เชญเชพเช— เชฒเซ‡เชจเชพเชฐเชพเช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ เชฆเชพเช–เชฒ เช•เชฐเซ‹ เช…เชจเซ‡ เชชเชฐเชฟเชฃเชพเชฎ เชฎเซ‡เชณเชตเซ‹ - เชคเชฎเชพเชฐเซ‡ เชœเซ‡ เชŸเซ€เชช เช›เซ‹เชกเชตเซ€ เชœเซ‹เชˆเช.

เชชเซเชฐเชพเชฐเช‚เชญ

เชธเช‚เชชเซ‚เชฐเซเชฃ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡:
เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เชชเซเชฐเชฅเชฎ เช•เซเชฐเชฟเชฏเชพ - เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เช†เชงเชพเชฐ เชกเชพเช‰เชจเชฒเซ‹เชก เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช. เชคเซ‡เชจเซ‡ เชเชจเซเชกเซเชฐเซ‹เช‡เชก เชธเซเชŸเซเชกเชฟเชฏเซ‹ 3.0 เช…เชฅเชตเชพ เชชเช›เซ€เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เช–เซ‹เชฒเซ‹. เช…เชฎเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ€เช เช›เซ€เช เช…เชจเซ‡ เชฒเซ‹เชจเซเชš เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชธเชซเซ‡เชฆ เชธเซเช•เซเชฐเซ€เชจ เชœเซ‹เชˆเช เช›เซ€เช. เชฌเชงเซเช‚ เชธเชพเชฐเซเช‚ เช›เซ‡, เชเชตเซเช‚ เชœ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช.

เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เชฌเชงเซเช‚ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ€ เช•เซเชฐเชฟเชฏเชพเช“ เช•เชพเชฒเช•เซเชฐเชฎเชฟเช• เช•เซเชฐเชฎเชฎเชพเช‚ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชฎเชพเช‚ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡. เชคเซ‡เชจเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡, View -> Tool Windows -> TODO เช–เซ‹เชฒเซ‹.

เช…เชฎเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‹ เช…เชญเซเชฏเชพเชธ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เช•เชฒเชฐ เชชเซ‡เชฒเซ‡เชŸเชจเซเช‚ เชฎเซ‚เชฒเซเชฏเชพเช‚เช•เชจ เช•เชฐเชตเชพ colors.xml เช–เซ‹เชฒเซ€เช เช›เซ€เช. strings.xml เชฎเชพเช‚ เชŸเซ‡เช•เซเชธเซเชŸ เชกเซ‡เชŸเชพ (เชธเชนเซ€เช“) เชนเซ‹เชฏ เช›เซ‡, เช…เชจเซ‡ styles.xml เชฎเชพเช‚ เช˜เชฃเชพ เชซเซ‹เชจเซเชŸ เชŸเซ‡เชฎเซเชชเชฒเซ‡เชŸเซเชธ เชนเซ‹เชฏ เช›เซ‡.

เช–เชฐเซเชš เชตเชฟเชญเชพเช— เชตเชฟเช•เชพเชธ

activity_main.xml เช–เซ‹เชฒเซ‹ เช…เชจเซ‡ เชจเซ€เชšเซ‡เชจเซ‹ เช•เซ‹เชก เชฒเซ€เชจเชฟเชฏเชฐเชฒเซ‡เช†เช‰เชŸเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‹ (#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>

เช…เชฎเซ‡ TODO เชจเซ€ เชธเซ‚เชšเชฟ เชชเช›เซ€ เชฒเซ€เชจเชฟเชฏเชฐเชฒเซ‡เช†เช‰เชŸ เชฌเช‚เชง เช•เชฐเซ€เช เช›เซ€เช, เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชจเซ‡ เชฒเซ€เชจเชฟเชฏเชฐเชฒเซ‡เช†เช‰เชŸ (#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"/>

เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซเช‚ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏ เชฐเซ‡เชธเซเชŸเซ‹เชฐเชจเซเชŸเชจเชพ เชฎเซ‡เชณเชพเชตเชกเชพเชฎเชพเช‚ เชฆเชฐเซ‡เช• เชธเชนเชญเชพเช—เซ€ เชฎเชพเชŸเซ‡ เชตเซเชฏเช•เซเชคเชฟเช—เชค เช–เชฐเซเชšเชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพเชจเซเช‚ เชนเซ‹เชตเชพเชฅเซ€, เช•เชฟเช‚เชฎเชค เชชเชฐเชชเชฐเชธเชจ เชŸเซ‡เช•เซเชธเซเชŸ เชตเซเชฏเซ‚ เชฎเซเช–เซเชฏ เชญเซ‚เชฎเชฟเช•เชพ เชญเชœเชตเซ‡ เช›เซ‡.

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
 
}

เชฌเชŸเชจเซ‹ เชธเชฎเชพเชชเซเชค

เชฌเชŸเชจ เช•เซเชฒเชฟเช• เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชฅเชจ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช…เชฎเซ‡ เชตเชฐเซเช— เชธเซเชคเชฐ (#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 {

เชชเช›เซ€ เช…เชฎเซ‡ เชฌเชฟเชฒ เชเชกเชฟเชŸ เชŸเซ‡เช•เซเชธเซเชŸ เชฒเชฟเชธเชจเชฐ (#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) {}

เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เชธเชพเชฐเซเช‚, เชนเชตเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชฌเชงเซเช‚ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡! เช…เชญเชฟเชจเช‚เชฆเชจ, เชคเชฎเซ‡ เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชคเชฎเชพเชฐเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ โ€œเชŸเชฟเชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐโ€ เชฒเช–เซเชฏเซเช‚ เช›เซ‡.

เช•เซ‹เชŸเชฒเชฟเชจเชฎเชพเช‚ เชŸเซ€เชช เช•เซ‡เชฒเซเช•เซเชฏเซเชฒเซ‡เชŸเชฐ เชฌเชจเชพเชตเชตเซเช‚: เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡?

เชธเซเช•เชฟเชฒเชฌเซ‹เช•เซเชธ เชญเชฒเชพเชฎเชฃ เช•เชฐเซ‡ เช›เซ‡:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹