เจ•เฉ‹เจŸเจฒเจฟเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเจฟเจช เจ•เฉˆเจฒเจ•เฉเจฒเฉ‡เจŸเจฐ เจฌเจฃเจพเจ‰เจฃเจพ: เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ?

เจ•เฉ‹เจŸเจฒเจฟเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเจฟเจช เจ•เฉˆเจฒเจ•เฉเจฒเฉ‡เจŸเจฐ เจฌเจฃเจพเจ‰เจฃเจพ: เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ?

เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฆเจฟเจ–เจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ•เฉ‹เจŸเจฒเจฟเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจŸเจฟเจช เจ•เฉˆเจฒเจ•เฉ‚เจฒเฉ‡เจธเจผเจจ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ•เจฟเจตเฉ‡เจ‚ เจฌเจฃเจพเจˆเจเฅค เจตเจงเฉ‡เจฐเฉ‡ เจธเจŸเฉ€เจ• เจนเฉ‹เจฃ เจฒเจˆ, เจ•เฉ‹เจŸเจฒเจฟเจจ 1.3.21, เจเจ‚เจกเจฐเฉŒเจ‡เจก 4, เจเจ‚เจกเจฐเฉŒเจ‡เจก เจธเจŸเฉ‚เจกเฉ€เจ“ 3. เจฒเฉ‡เจ– เจฆเจฟเจฒเจšเจธเจช เจนเฉ‹เจตเฉ‡เจ—เจพ, เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจœเฉ‹ เจเจ‚เจกเจฐเฉŒเจ‡เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจตเจฟเฉฑเจš เจ†เจชเจฃเฉ€ เจฏเจพเจคเจฐเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจจ. เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจน เจธเจฎเจเจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ•เฉ€ เจ…เจคเฉ‡ เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ…เจœเจฟเจนเจพ เจ•เฉˆเจฒเจ•เฉเจฒเฉ‡เจŸเจฐ เจ‰เจฆเฉ‹เจ‚ เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจฐเฉˆเจธเจŸเฉ‹เจฐเฉˆเจ‚เจŸ เจœเจพเจ‚ เจ•เฉˆเจซเฉ‡ เจตเจฟเฉฑเจš เจธเจฎเจพเจ‚ เจฌเจฟเจคเจพเจ‰เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เจฐเจจ เจตเจพเจฒเฉ€ เจ•เฉฐเจชเจจเฉ€ เจคเฉ‹เจ‚ เจธเฉเจเจพเจตเจพเจ‚ เจฆเฉ€ เจฎเจพเจคเจฐเจพ เจฆเฉ€ เจ—เจฃเจจเจพ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค เจฌเฉ‡เจธเจผเฉฑเจ•, เจนเจฐ เจ•เฉ‹เจˆ เจจเจนเฉ€เจ‚ เจ…เจคเฉ‡ เจนเจฎเฉ‡เจธเจผเจพ เจตเฉ‡เจŸเจฐเจพเจ‚ เจฒเจˆ เจšเจพเจน เจจเจนเฉ€เจ‚ เจ›เฉฑเจกเจฆเจพ, เจ‡เจน เจ‡เฉฑเจ• เจชเฉฑเจ›เจฎเฉ€ เจชเจฐเฉฐเจชเจฐเจพ เจนเฉˆ, เจชเจฐ เจ…เจœเจฟเจนเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจตเจฟเจ•เจธเจค เจ•เจฐเจจ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจช เจนเฉˆ.

เจ…เจธเฉ€เจ‚ เจฏเจพเจฆ เจฆเจฟเจตเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚: "Habr" เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจชเจพเจ เจ•เจพเจ‚ เจฒเจˆ - "Habr" เจชเฉเจฐเจšเจพเจฐ เจ•เฉ‹เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจ•เฉ‹เจฐเจธ เจตเจฟเฉฑเจš เจฆเจพเจ–เจฒเจพ เจฒเฉˆเจฃ เจตเฉ‡เจฒเฉ‡ 10 เจฐเฉ‚เจฌเจฒ เจฆเฉ€ เจ›เฉ‹เจŸเฅค

เจธเจ•เจฟเฉฑเจฒเจฌเจพเจ•เจธ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ: เจชเฉเจฐเฉˆเจ•เจŸเฉ€เจ•เจฒ เจ•เฉ‹เจฐเจธ "เจฎเฉ‹เจฌเจพเจˆเจฒ เจกเจฟเจตเฉˆเจฒเจชเจฐ เจชเฉเจฐเฉ‹.

เจ‡เจน เจนเฉˆ เจ•เจฟ เจœเจฆเฉ‹เจ‚ เจ‡เจน เจเจช เจšเฉฑเจฒเจฆเฉ€ เจนเฉˆ เจคเจพเจ‚ เจ‡เจน เจ•เจฟเจนเฉ‹ เจœเจฟเจนเจพ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

เจ•เฉ‹เจŸเจฒเจฟเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเจฟเจช เจ•เฉˆเจฒเจ•เฉเจฒเฉ‡เจŸเจฐ เจฌเจฃเจพเจ‰เจฃเจพ: เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ?

เจคเฉเจธเฉ€เจ‚ เจ•เฉเฉฑเจฒ เจฐเจ•เจฎ เจฆเฉ€ เจฒเฉ‹เฉœเฉ€เจฆเฉ€ เจชเฉเจฐเจคเฉ€เจธเจผเจคเจคเจพ, เจฎเฉ€เจŸเจฟเฉฐเจ— เจตเจฟเฉฑเจš เจญเจพเจ— เจฒเฉˆเจฃ เจตเจพเจฒเจฟเจ†เจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจฆเจฐเจœ เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจจเจคเฉ€เจœเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹ - เจธเฉเจเจพเจตเจพเจ‚ เจฆเฉ€ เจฎเจพเจคเจฐเจพ เจœเฉ‹ เจ›เฉฑเจกเฉ€ เจœเจพเจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆเฅค

เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจจเจพ

เจเจช เจฆเจพ เจชเฉ‚เจฐเจพ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจฆเจพ เจนเฉˆ:
เจ•เฉ‹เจŸเจฒเจฟเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเจฟเจช เจ•เฉˆเจฒเจ•เฉเจฒเฉ‡เจŸเจฐ เจฌเจฃเจพเจ‰เจฃเจพ: เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ?

เจ•เฉ‹เจŸเจฒเจฟเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเจฟเจช เจ•เฉˆเจฒเจ•เฉเจฒเฉ‡เจŸเจฐ เจฌเจฃเจพเจ‰เจฃเจพ: เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ?

เจชเจนเจฟเจฒเฉ€ เจ•เจพเจฐเจตเจพเจˆ - เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจ…เจงเจพเจฐ เจกเจพเจŠเจจเจฒเฉ‹เจก. เจ‡เจธเจจเฉ‚เฉฐ เจเจ‚เจกเจฐเฉŒเจ‡เจก เจธเจŸเฉ‚เจกเฉ€เจ“ 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 เจธเฉ‚เจšเฉ€ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจฒเฉ€เจจเฉ€เจ…เจฐ เจฒเฉ‡เจ†เจ‰เจŸ เจจเฉ‚เฉฐ เจฌเฉฐเจฆ เจ•เจฐเฉ‹, เจ…เจคเฉ‡ เจซเจฟเจฐ เจ‡เจธเจจเฉ‚เฉฐ เจฒเฉ€เจจเฉ€เจ…เจฐ เจฒเฉ‡เจ†เจ‰เจŸ (#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 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

เจ•เฉ‹เจŸเจฒเจฟเจจ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจŸเจฟเจช เจ•เฉˆเจฒเจ•เฉเจฒเฉ‡เจŸเจฐ เจฌเจฃเจพเจ‰เจฃเจพ: เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ?
เจ…เจธเฉ€เจ‚ เจŸเฉˆเจธเจŸ เจฒเจˆ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ เจ•เฉเฉฑเจฒ เจจเฉเจ•เจธเจพเจจ (เจŸเฉเฉฑเจŸเฉ‡ เจนเฉ‹เจ เจ•เฉฑเจช, เจชเจฒเฉ‡เจŸเจพเจ‚, เจ†เจฆเจฟ) เจฆเฉ‡ เจฎเจพเจชเจฆเฉฐเจก เจฆเจฐเจœ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค

"เจฒเฉ‹เจ• เจ…เจคเฉ‡ เจธเฉเจเจพเจ…" เจญเจพเจ— เจฆเจพ เจตเจฟเจ•เจพเจธ

เจ‡เฉฑเจ• เจŸเจฟเจช เจฐเจ•เจฎ เจšเฉ‹เจฃเจ•เจพเจฐ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจจ เจฒเจˆ, เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ 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) เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹:

  • เจšเจฟเฉฑเจคเจฐ เจฌเจŸเจจ เจ†เจˆเจกเฉ€ (เจ˜เจŸเจพเจ“ เจฒเฉ‹เจ• เจฌเจŸเจจ, เจฒเฉ‹เจ• เจฌเจŸเจจ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹)
  • 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() {
 
โ€ฆ
 
}

เจ…เจธเฉ€เจ‚ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เจน เจฌเจนเฉเจค เจตเจงเฉ€เจ† เจฆเจฟเจ–เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจชเจฐ เจ‡เจน เจฌเจฟเจนเจคเจฐ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆ.

เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ‡เจจเจตเฉŒเจ‡เจธ เจฆเฉ€ เจฐเจ•เจฎ เจจเฉ‚เฉฐ เจนเจŸเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจซเจฟเจฐ เจธเฉฐเจ•เฉ‡เจคเจพเจ‚ เจœเจพเจ‚ เจฆเฉ‹เจธเจคเจพเจ‚ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจเจช เจ•เฉเจฐเฉˆเจธเจผ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เจพ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจœเฉ‡ เจคเฉฑเจ• เจœเจผเฉ€เจฐเฉ‹ เจฒเจพเจ—เจคเจพเจ‚ เจฒเจˆ เจ•เฉ‹เจˆ เจœเจพเจ‚เจš เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ‡เจจเจตเฉŒเจ‡เจธ เจฐเจ•เจฎ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ–เจฐเจšเฉ‡ เจ…เฉฑเจชเจกเฉ‡เจŸ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเจ—เฉ‡เฅค

เจ…เฉฐเจคเจฎ เจ•เจฆเจฎ

เจŸเฉˆเจ•เจธเจŸเจตเจพเจšเจฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹ (#16):

เจ•เจฒเจพเจธ เจฎเฉ‡เจจเจเจ•เจŸเฉ€เจตเจฟเจŸเฉ€: เจเจชเจ•เฉฐเจชเฉˆเจŸเจเจ•เจŸเฉ€เจตเจฟเจŸเฉ€(), View.OnClickListener, TextWatcher {

เจซเจฟเจฐ เจ…เจธเฉ€เจ‚ เจฌเจฟเจฒ เจเจกเจฟเจŸ เจŸเฉˆเจ•เจธเจŸ เจฒเจฟเจธเจจเจฐ (#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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹