ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

ืžื™ืจ ื–ืึธื’ืŸ ืื™ืจ ื•ื•ื™ ืฆื• ืฉืึทืคึฟืŸ ืึท ืคึผืฉื•ื˜ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟืึทืจ ืงืึทืœืงื™ืึทืœื™ื™ื˜ื™ื ื’ ืขืฆื•ืช ืื™ืŸ ืงืึธื˜ืœื™ืŸ. ืžืขืจ ื’ืขื ื•ื™, ืงืึธื˜ืœื™ืŸ 1.3.21, ืึทื ื“ืจื•ื™ื“ 4, ืึทื ื“ืจื•ื™ื“ ืกื˜ื•ื“ื™ืึธ 3. ื“ืขืจ ืึทืจื˜ื™ืงืœ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื˜ืฉื™ืงืึทื•ื•ืข, ืขืจืฉื˜ืขืจ ืคื•ืŸ ืึทืœืข, ืคึฟืึทืจ ื“ื™ ื•ื•ืืก ื–ืขื ืขืŸ ืกื˜ืึทืจื˜ื™ื ื’ ื–ื™ื™ืขืจ ื ืกื™ืขื” ืื™ืŸ ืึทื ื“ืจื•ื™ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’. ืขืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืคึฟืึทืจืฉื˜ื™ื™ืŸ ื•ื•ืึธืก ืื•ืŸ ื•ื•ื™ ืขืก ืึทืจื‘ืขื˜ ืื™ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ.

ื“ืขืจ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ื•ื•ืขืŸ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืจืขื›ืขื ืขืŸ ื“ื™ ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ืขืฆื•ืช ืคื•ืŸ ืึท ืคื™ืจืžืข ื•ื•ืึธืก ื‘ืึทืฉืœืึธืกืŸ ืฆื• ืคืึทืจื‘ืจืขื ื’ืขืŸ ืฆื™ื™ื˜ ืื™ืŸ ืึท ืจืขืกื˜ืึธืจืึทืŸ ืึธื“ืขืจ ืงืึทืคืข. ืคึฟืึทืจืฉื˜ื™ื™ื˜ ื–ื™ืš, ืึทื– ื ื™ื˜ ืึทืœืข ืœืึธื–ื˜ ืึทืœืขืžืึธืœ ืึท ืฉืคึผื™ืฅ ืคึฟืึทืจ ื“ื™ ืงืขืœื ืขืจืก, ื“ืึธืก ืื™ื– ืžืขืจ ืึท ืžืขืจื‘ื“ื™ืงืข ื˜ืจืึทื“ื™ืฆื™ืข, ืึธื‘ืขืจ ื“ืขืจ ืคึผืจืึธืฆืขืก ืคึฟื•ืŸ ืึทื ื˜ื•ื•ื™ืงืœืขืŸ ืึทื–ืึท ืึทืคึผืคึผืœื™ืงืึทืฆื™ืข ืื™ื– ืžืžื™ืœื ืื™ื ื˜ืขืจืขืกืึทื ื˜;

ืžื™ืจ ื“ืขืจืžืึธื ืขืŸ ืื™ืจ: ืคึฟืึทืจ ืึทืœืข ืœื™ื™ืขื ืขืจ ืคื•ืŸ "ื”ื‘ืจ" - ืึท ืึทืจืึธืคึผืจืขื›ืขื ืขืŸ ืคื•ืŸ 10 ืจื•ื‘ืœ ื•ื•ืขืŸ ืื™ืจ ืคืึทืจืฉืจื™ื™ึทื‘ืŸ ืื™ืŸ ืงื™ื™ืŸ ืกืงื™ืœื‘ืึธืงืก ืงื•ืจืก ื ื™ืฆืŸ ื“ื™ ืคึผืขืจืžืึธื•ืฉืึทื ืึทืœ ืงืึธื“ "ื”ื‘ืจ".

Skillbox ืจืขืงืึทืžืขื ื“ื–: ืคึผืจืึทืงื˜ื™ืฉ ืงื•ืจืก "ืžืึธื‘ื™ืœ ื“ืขื•ื•ืขืœืึธืคึผืขืจ PRO.

ื“ืึธืก ืื™ื– ื•ื•ื™ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงื•ืงื˜ ื•ื•ื™ ืื™ืŸ ืึธืคึผืขืจืึทืฆื™ืข:

ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

ืื™ืจ ืึทืจื™ื™ึทืŸ ื“ื™ ื’ืขื•ื•ืืœื˜ ืคึผืจืึธืฆืขื ื˜ ืคื•ืŸ ื“ื™ ื’ืึทื ืฅ ืกื•ืžืข, ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื‘ืึทื’ืขื’ืขื ื™ืฉ ืคึผืึทืจื˜ื™ืกืึทืคึผืึทื ืฅ, ืื•ืŸ ื‘ืึทืงื•ืžืขืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ - ื“ื™ ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ืฉืคึผื™ืฅ ืื™ืจ ื–ืึธืœ ืœืึธื–ืŸ.

ื’ืขื˜ื™ื ื’ ืกื˜ืึทืจื˜ืขื“

ื“ื™ ื’ืึทื ืฅ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืฆื•ื‘ื™ื ื“ ืงื•ืงื˜ ื•ื•ื™ ื“ืึธืก:
ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

ืขืจืฉื˜ืขืจ ืงืึทืžืฃ - ื“ืึทื•ื ืœืึธื•ื“ื™ื ื’ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื‘ืึทื–ืข. ืขืคึฟืขื ืขืŸ ืขืก ืื™ืŸ ืึทื ื“ืจื•ื™ื“ ืกื˜ื•ื“ื™ืึธ 3.0 ืึธื“ืขืจ ืฉืคึผืขื˜ืขืจ. ืžื™ืจ ื‘ื•ื™ืขืŸ ืื•ืŸ ืงืึทื˜ืขืจ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื•ืŸ ื–ืขืŸ ืึท ื•ื•ื™ื™ึทืก ืคืึทืจืฉื˜ืขืœืŸ. ืึทืœืฅ ืื™ื– ื’ื•ื˜, ืึทื–ื•ื™ ืขืก ื–ืึธืœ ื–ื™ื™ืŸ.

ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

ื‘ืึทื ื™ืฆืขืจ ืึทืงืฉืึทื ื– ื–ืขื ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ืŸ ืงืจืึทื ืึทืœืึทื“ื–ืฉื™ืงืึทืœ ืกื“ืจ ืฆื• ืžืึทื›ืŸ ืึทืœืฅ ืงืœืึธืจ. ืฆื• ื–ืขืŸ ืขืก, ืขืคืขื ืขืŸ View -> Tool Windows -> TODO.

ืžื™ืจ ืœืขืจื ืขืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื•ืŸ ืขืคืขื ืขืŸ ืงืึธืœืึธืจืก.ืงืกืžืœ ืฆื• ืึธืคึผืฉืึทืฆืŸ ื“ื™ ืงืึธืœื™ืจ ืคึผืึทืœื™ื˜ืจืข. 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>

ืžื™ืจ ืคืึทืจืžืึทื›ืŸ ื“ื™ ืœื™ื ืขืึทืจ ืœื™ื™ึทืึทื•ื˜ ื ืึธืš ื“ื™ ืจืฉื™ืžื” ืคื•ืŸ ื˜ืึธื“ืึธ, ืื•ืŸ ื“ืขืจื™ื‘ืขืจ ืœื™ื™ื’ืŸ ื ื™ื™ึท ืงืึธื“, ืคึผืœื™ื™ืกื™ื ื’ ืขืก ืื™ืŸ ื“ื™ ืœื™ื ืขืึทืจ ืœื™ื™ึทืึทื•ื˜ (#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"/>

ื–ื™ื ื˜ ื“ื™ ื”ื•ื™ืคึผื˜ ืึทืจื‘ืขื˜ ืคื•ืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ืฆื• ืจืขื›ืขื ืขืŸ ื™ื—ื™ื“ ืงืึธืก ืคึฟืึทืจ ื™ืขื“ืขืจ ื‘ืึทื˜ื™ื™ืœื™ืงื˜ืขืจ ืื™ืŸ ืึท ืจืขืกื˜ืึธืจืึทืŸ ืฆื•ื ื•ื™ืคืงื•ื, ืงืึธืก ืคึผืขืจืคึผืขืจืกืึธืŸ ื˜ืขืงืกื˜ื•ื•ื™ืขื•ื• ืคื™ืขืกืขืก ื“ื™ ื”ื•ื™ืคึผื˜ ืจืึธืœืข.

ืขื“ื™ื˜ื˜ืขืงืกื˜ ืœื™ืžืึทืฅ ื“ื™ ืึทืจื™ื™ึทื ืฉืจื™ื™ึทื‘ ืฆื• ืื™ื™ืŸ ืฉื•ืจื”, ื“ืขื ืคึผืึทืจืึทืžืขื˜ืขืจ ืžื•ื–ืŸ ื–ื™ื™ืŸ ืฉื˜ืขืœืŸ ืฆื• 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. ImageButtons ื–ืขื ืขืŸ ืฆื•ื’ืขืฉื˜ืขืœื˜ ืžื™ื˜ ื™ื™ืงืึทื ื– ืื™ืŸ ืึท ื˜ืขืงืข ืžื™ื˜ ืฉืจื™ื™ึทื‘ืŸ ืคึผืขืจืžื™ืฉืึทื ื–.

ืงืึธืคึผื™ ื“ื™ ืึธืคึผื˜ื™ื™ืœื•ื ื’ ื’ืึธืจ ืื•ืŸ ืœื™ื™ื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข (#5):

  • ImageButton ื™ื“ืก (subtractPeopleButton, addPeopleButton)
  • TextView ids (ื ื•ืžืขืจ ืคื•ืŸ ืžืขื ื˜ืฉืŸ ืกื˜ืึทื˜ื™ืง ื˜ืขืงืกื˜, ื ื•ืžืขืจ ืคื•ืŸ ืžืขื ื˜ืฉืŸ ื˜ืขืงืกื˜ื•ื•ื™ืขื•ื•)
  • DefaultText ืคึฟืึทืจ 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):

ืงืœืึทืก MainActivity: 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) {}

ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

ื ื•, ืื™ืฆื˜ ืœืขื’ืึทืžืจืข ืึทืœืฅ ืึทืจื‘ืขื˜! ืžืึทื–ืœ - ื˜ืึธื•ื•, ืื™ืจ ื”ืึธื˜ ื’ืขืฉืจื™ื‘ืŸ ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข "ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ" ืื™ืŸ ืงืึธื˜ืœื™ืŸ.

ืฉืึทืคึฟืŸ ืึท ืฉืคึผื™ืฅ ืงืึทืœืงื•ืœืึทื˜ืึธืจ ืื™ืŸ ืงืึธื˜ืœื™ืŸ: ื•ื•ื™ ื˜ื•ื˜ ืขืก ืึทืจื‘ืขื˜?

Skillbox ืจืขืงืึทืžืขื ื“ื–:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’