เด•เต‹เดŸเตเดฒเดฟเดจเดฟเตฝ เด’เดฐเต เดŸเดฟเดชเตเดชเต เด•เดพเตฝเด•เตเด•เตเดฒเต‡เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต: เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚?

เด•เต‹เดŸเตเดฒเดฟเดจเดฟเตฝ เด’เดฐเต เดŸเดฟเดชเตเดชเต เด•เดพเตฝเด•เตเด•เตเดฒเต‡เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต: เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚?

เด•เต‹เดŸเตเดฒเดฟเดจเดฟเดฒเต† เดจเตเดฑเตเด™เตเด™เตเด•เตพ เด•เดฃเด•เตเด•เตเด•เต‚เดŸเตเดŸเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดŽเด™เตเด™เดจเต† เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดžเด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเดจเตเดจเต. เด•เต‚เดŸเตเดคเตฝ เด•เตƒเดคเตเดฏเดฎเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, เด•เต‹เดŸเตโ€Œเดฒเดฟเตป 1.3.21, เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต 4, เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ 3. เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดกเต†เดตเดฒเดชเตโ€Œเดฎเต†เดจเตเดฑเดฟเตฝ เดฏเดพเดคเตเดฐ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดตเตผเด•เตเด•เต เดฒเต‡เด–เดจเด‚ เดฐเดธเด•เดฐเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚. เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดŽเดจเตเดคเดพเดฃเต, เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดพเตป เด‡เดคเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เด’เดฐเต เดฑเต†เดธเตเดฑเตเดฑเต‹เดฑเดจเตเดฑเดฟเดฒเต‹ เด•เดซเต‡เดฏเดฟเดฒเต‹ เดธเดฎเดฏเด‚ เดšเต†เดฒเดตเดดเดฟเด•เตเด•เดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด•เดฎเตเดชเดจเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดจเตเดฑเตเด™เตเด™เตเด•เดณเตเดŸเต† เด…เดณเดตเต เดจเดฟเด™เตเด™เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เต‡เดฃเตเดŸเดฟเดตเดฐเตเดฎเตเดชเต‹เตพ เดˆ เด•เดพเตฝเด•เตเด•เตเดฒเต‡เดฑเตเดฑเตผ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเด‚. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดŽเดฒเตเดฒเดพเดตเดฐเตเด‚ เดŽเดชเตเดชเต‹เดดเตเด‚ เดตเต†เดฏเดฟเดฑเตเดฑเตผเดฎเดพเตผเด•เตเด•เต เด’เดฐเต เดจเตเดฑเตเด™เตเด™เต เดจเตฝเด•เดฟเดฒเตเดฒ; เด‡เดคเต เด’เดฐเต เดชเดพเดถเตเดšเดพเดคเตเดฏ เดชเดพเดฐเดฎเตเดชเดฐเตเดฏเดฎเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดตเดฟเด•เดธเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดเดคเต เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเดฒเตเด‚ เดฐเดธเด•เดฐเดฎเดพเดฃเต.

เดžเด™เตเด™เตพ เด“เตผเดฎเตเดฎเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต: "Habr"-เดจเตเดฑเต† เดŽเดฒเตเดฒเดพ เดตเดพเดฏเดจเด•เตเด•เดพเตผเด•เตเด•เตเด‚ - "Habr" เดชเตเดฐเตŠเดฎเต‹เดทเดฃเตฝ เด•เต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เด•เต‹เดดเตเดธเดฟเตฝ เดšเต‡เดฐเตเดฎเตเดชเต‹เตพ 10 เดฑเต‚เดฌเดฟเตพเดธเต เด•เดฟเดดเดฟเดตเต.

เดธเตเด•เดฟเตฝเดฌเต‹เด•เตเดธเต เดถเตเดชเดพเตผเดถ เดšเต†เดฏเตเดฏเตเดจเตเดจเต: เดชเตเดฐเดพเดฏเต‹เด—เดฟเด• เด•เต‹เดดเตเดธเต "เดฎเตŠเดฌเตˆเตฝ เดกเต†เดตเดฒเดชเตเดชเตผ เดชเดฟ.เด†เตผ.เด’.

เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

เด•เต‹เดŸเตเดฒเดฟเดจเดฟเตฝ เด’เดฐเต เดŸเดฟเดชเตเดชเต เด•เดพเตฝเด•เตเด•เตเดฒเต‡เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต: เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚?

เดจเดฟเด™เตเด™เตพ เด†เด•เต† เดคเตเด•เดฏเตเดŸเต† เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดถเดคเดฎเดพเดจเด‚, เดฎเต€เดฑเตเดฑเดฟเด‚เด—เดฟเตฝ เดชเด™เตเด•เต†เดŸเตเด•เตเด•เตเดจเตเดจเดตเดฐเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดŽเดจเตเดจเดฟเดต เดจเตฝเด•เตเด•, เดซเดฒเด‚ เดจเต‡เดŸเตเด• - เดจเดฟเด™เตเด™เตพ เด‰เดชเต‡เด•เตเดทเดฟเด•เตเด•เต‡เดฃเตเดŸ เดŸเดฟเดชเตเดชเดฟเดจเตเดฑเต† เดคเตเด•.

เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต

เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‡เดจเตเดฑเตผเดซเต‡เดธเต เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:
เด•เต‹เดŸเตเดฒเดฟเดจเดฟเตฝ เด’เดฐเต เดŸเดฟเดชเตเดชเต เด•เดพเตฝเด•เตเด•เตเดฒเต‡เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต: เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚?

เด•เต‹เดŸเตเดฒเดฟเดจเดฟเตฝ เด’เดฐเต เดŸเดฟเดชเตเดชเต เด•เดพเตฝเด•เตเด•เตเดฒเต‡เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต: เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚?

เด†เดฆเตเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ - เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดฌเต‡เดธเต เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด†เตปเดกเตเดฐเต‹เดฏเดฟเดกเต เดธเตเดฑเตเดฑเตเดกเดฟเดฏเต‹ 3.0-เดฒเต‹ เด…เดคเดฟเดจเตเดถเต‡เดทเดฎเตเดณเตเดณ เดชเดคเดฟเดชเตเดชเดฟเดฒเต‹ เด‡เดคเต เดคเตเดฑเด•เตเด•เตเด•. เดžเด™เตเด™เตพ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด’เดฐเต เดตเตˆเดฑเตเดฑเต เดธเตเด•เตเดฐเต€เตป เด•เดพเดฃเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดŽเดฒเตเดฒเดพเด‚ เดถเดฐเดฟเดฏเดพเดฃเต, เด…เด™เตเด™เดจเต†เดฏเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚.

เด•เต‹เดŸเตเดฒเดฟเดจเดฟเตฝ เด’เดฐเต เดŸเดฟเดชเตเดชเต เด•เดพเตฝเด•เตเด•เตเดฒเต‡เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต: เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚?

เด•เต‹เดŸเตเดฒเดฟเดจเดฟเตฝ เด’เดฐเต เดŸเดฟเดชเตเดชเต เด•เดพเตฝเด•เตเด•เตเดฒเต‡เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเต: เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚?

เดŽเดฒเตเดฒเดพเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด•เดพเดฒเด•เตเดฐเดฎเดคเตเดคเดฟเตฝ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเตฝ เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เด•เดพเดฃเตเดจเตเดจเดคเดฟเดจเต, View -> Tool Windows -> TODO เดคเตเดฑเด•เตเด•เตเด•.

เดžเด™เตเด™เตพ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดชเด เดฟเด•เตเด•เตเด•เดฏเตเด‚ เดตเตผเดฃเตเดฃ เดชเดพเดฒเดฑเตเดฑเต เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเต color.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>

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

เด’เดฐเต เดฑเดธเตเดฑเตเดฑเต‹เดฑเดจเตเดฑเต เด’เดคเตเดคเตเดšเต‡เดฐเดฒเดฟเตฝ เดชเด™เตเด•เต†เดŸเตเด•เตเด•เตเดจเตเดจ เด“เดฐเต‹ เดตเตเดฏเด•เตเดคเดฟเด•เตเด•เตเด‚ เดตเตเดฏเด•เตเดคเดฟเด—เดค เดšเต†เดฒเดตเตเด•เตพ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเดฑเต† เดชเตเดฐเดงเดพเดจ เดšเตเดฎเดคเดฒ เดŽเดจเตเดจเดคเดฟเดจเดพเตฝ, 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):

  • เด‡เดฎเต‡เดœเต เดฌเดŸเตเดŸเตบ เดเดกเดฟเด•เตพ (เดชเต€เดชเตเดชเดฟเตพเดฌเดŸเตเดŸเตบ เด•เตเดฑเดฏเตเด•เตเด•เตเด•, เด†เดกเต เดชเต€เดชเตเดชเดฟเตพเดฌเดŸเตเดŸเตบ)
  • เดŸเต†เด•เตเดธเตเดฑเตเดฑเต เดตเตเดฏเต‚ เดเดกเดฟเด•เตพ (เดจเดฎเตเดชเตผเด“เดซเต เดชเต€เดชเตเดชเดฟเตพเดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดŸเต†เด•เตเดธเตเดฑเตเดฑเต, เดจเดฎเตเดชเตผเด“เดซเต เดชเต€เดชเตเดชเดฟเตพเดŸเต†เด•เตเดธเตเดฑเตเดฑเต เดตเตเดฏเต‚)
  • 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):

เด•เตเดฒเดพเดธเต 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()
        }
    }

เดฌเดŸเตเดŸเดฃเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดธเตเดตเดฟเดšเตเดšเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เด•เต‹เดŸเตเดฒเดฟเตป เดŽเดฒเตเดฒเดพเด‚ เดตเดณเดฐเต† เดฐเดธเด•เดฐเดฎเดพเดฃเต! เดŽเดฒเตเดฒเดพ เด‡เตปเด•เตเดฐเดฟเดฎเต†เดจเตเดฑเต, เดกเดฟเด•เตเดฐเดฟเดฎเต†เดจเตเดฑเต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเด‚ เดšเตเดตเดŸเต†เดฏเตเดณเตเดณ เด•เต‹เดกเต เดšเต‡เตผเด•เตเด•เตเด•
(#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):

เด•เตเดฒเดพเดธเต เดชเตเดฐเดงเดพเดจ เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚: AppCompatActivity(), 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•