แƒฌแƒ•แƒ”แƒ แƒ˜ แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก?

แƒฌแƒ•แƒ”แƒ แƒ˜ แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก?

แƒฉแƒ•แƒ”แƒœ แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ—, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜ แƒ แƒฉแƒ”แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒ—แƒ•แƒšแƒ”แƒšแƒแƒ“. แƒฃแƒคแƒ แƒ แƒ–แƒฃแƒกแƒขแƒแƒ“, Kotlin 1.3.21, Android 4, Android Studio 3. แƒกแƒขแƒแƒขแƒ˜แƒ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ, แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ›แƒแƒ—แƒ—แƒ•แƒ˜แƒก, แƒ•แƒ˜แƒœแƒช แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒ›แƒแƒ’แƒ–แƒแƒฃแƒ แƒแƒ‘แƒแƒก แƒแƒœแƒ“แƒ แƒแƒ˜แƒ“แƒ˜แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒแƒจแƒ˜. แƒ”แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ’แƒแƒ˜แƒ’แƒแƒ— แƒ แƒ แƒ“แƒ แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ—.

แƒ”แƒก แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜ แƒ’แƒแƒ›แƒแƒ’แƒแƒ“แƒ’แƒ”แƒ‘แƒแƒ—, แƒ แƒแƒชแƒ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒ—แƒ•แƒแƒšแƒแƒ— แƒ แƒฉแƒ”แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒ˜แƒกแƒ’แƒแƒœ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒก แƒ“แƒ แƒแƒ˜แƒก แƒ’แƒแƒขแƒแƒ แƒ”แƒ‘แƒแƒก แƒ แƒ”แƒกแƒขแƒแƒ แƒแƒœแƒจแƒ˜ แƒแƒœ แƒ™แƒแƒคแƒ”แƒจแƒ˜. แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ›แƒ˜แƒ›แƒขแƒแƒœแƒ”แƒ‘แƒก แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒแƒ  แƒฃแƒขแƒแƒ•แƒ”แƒ‘แƒก แƒฌแƒ•แƒ“แƒแƒ›แƒแƒก, แƒ”แƒก แƒฃแƒคแƒ แƒ แƒ“แƒแƒกแƒแƒ•แƒšแƒฃแƒ แƒ˜ แƒขแƒ แƒแƒ“แƒ˜แƒชแƒ˜แƒแƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒกแƒ”แƒ—แƒ˜ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒแƒ.

แƒจแƒ”แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ—: "Habr"-แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒคแƒแƒกแƒ“แƒแƒ™แƒšแƒ”แƒ‘แƒ 10 แƒ แƒฃแƒ‘แƒšแƒ˜แƒ“แƒแƒœ Skillbox-แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ™แƒฃแƒ แƒกแƒ–แƒ” แƒฉแƒแƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒกแƒแƒก "Habr" แƒกแƒแƒ แƒ”แƒ™แƒšแƒแƒ›แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

Skillbox แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—: แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒ™แƒฃแƒ แƒกแƒ˜ "แƒ›แƒแƒ‘แƒ˜แƒšแƒฃแƒ แƒ˜ แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜ PRO.

แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ”แƒฅแƒกแƒžแƒšแƒฃแƒแƒขแƒแƒชแƒ˜แƒแƒจแƒ˜:

แƒฌแƒ•แƒ”แƒ แƒ˜ แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก?

แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒงแƒแƒ•แƒ— แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒ˜ แƒ—แƒแƒœแƒฎแƒ˜แƒก แƒกแƒแƒกแƒฃแƒ แƒ•แƒ”แƒš แƒžแƒ แƒแƒชแƒ”แƒœแƒขแƒก, แƒจแƒ”แƒฎแƒ•แƒ”แƒ“แƒ แƒ˜แƒก แƒ›แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ—แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก แƒ“แƒ แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒจแƒ”แƒ“แƒ”แƒ’แƒก - แƒฌแƒ•แƒ”แƒ แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒ“แƒแƒขแƒแƒ•แƒแƒ—.

แƒ“แƒแƒ˜แƒฌแƒงแƒ

แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒ˜ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:
แƒฌแƒ•แƒ”แƒ แƒ˜ แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก?

แƒฌแƒ•แƒ”แƒ แƒ˜ แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก?

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ - แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ‘แƒแƒ–แƒ˜แƒก แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ. แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ˜แƒ— แƒ˜แƒก Android Studio 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 แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜.

แƒแƒฎแƒšแƒ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

แƒฌแƒ•แƒ”แƒ แƒ˜ แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก?
แƒ แƒแƒ’แƒแƒ แƒช แƒฎแƒ”แƒ“แƒแƒ•แƒ—, แƒฎแƒแƒ แƒฏแƒ”แƒ‘แƒ˜ แƒ’แƒแƒ›แƒแƒ˜แƒ—แƒ•แƒšแƒ”แƒ‘แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ–แƒ”.

แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ

แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜ แƒ™แƒแƒ“แƒ˜ LinearLayout-แƒก แƒฎแƒแƒ แƒฏแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ (#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>

แƒฉแƒ•แƒ”แƒœ แƒ•แƒฎแƒฃแƒ แƒแƒ•แƒ— LinearLayout-แƒก TODO-แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒแƒฎแƒแƒš แƒ™แƒแƒ“แƒก แƒ“แƒ แƒ•แƒแƒ—แƒแƒ•แƒกแƒ”แƒ‘แƒ— แƒ›แƒแƒก 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. ImageButtons แƒ›แƒแƒฌแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒฎแƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ แƒฉแƒแƒฌแƒ”แƒ แƒ˜แƒก แƒœแƒ”แƒ‘แƒแƒ แƒ—แƒ•แƒ˜แƒ—.

แƒ“แƒแƒแƒ™แƒแƒžแƒ˜แƒ แƒ”แƒ— แƒ’แƒแƒœแƒงแƒแƒคแƒ˜แƒšแƒ”แƒ‘แƒ แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒ“แƒ แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜ (#5):

  • ImageButton ID (แƒ’แƒแƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒPeopleButton, addPeopleButton)
  • TextView ID (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
 
}

แƒฆแƒ˜แƒšแƒแƒ™แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ

แƒฆแƒ˜แƒšแƒแƒ™แƒ–แƒ” แƒ“แƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒก แƒ“แƒแƒกแƒแƒ›แƒแƒขแƒ”แƒ‘แƒšแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ— 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() {
 
โ€ฆ
 
}

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ. แƒ›แƒจแƒ•แƒ”แƒœแƒ˜แƒ•แƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜แƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒแƒ“แƒ.

แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ— แƒแƒ›แƒแƒ˜แƒฆแƒแƒ— แƒ’แƒแƒ“แƒแƒกแƒแƒฎแƒแƒ“แƒ˜ แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒ–แƒแƒ แƒ“แƒแƒ— แƒ แƒฉแƒ”แƒ•แƒ”แƒ‘แƒ˜แƒก แƒแƒœ แƒ›แƒ”แƒ’แƒแƒ‘แƒ แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ, แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ แƒ“แƒแƒ˜แƒจแƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒฏแƒ”แƒ  แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜ แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒฆแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ. แƒฃแƒคแƒ แƒ แƒ›แƒ”แƒขแƒ˜แƒช, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒชแƒ“แƒ˜แƒšแƒแƒ‘แƒ— แƒ’แƒแƒ“แƒแƒกแƒแƒฎแƒแƒ“แƒ˜แƒก แƒ—แƒแƒœแƒฎแƒ˜แƒก แƒจแƒ”แƒชแƒ•แƒšแƒแƒก, แƒ’แƒแƒ“แƒแƒกแƒแƒฎแƒแƒ“แƒ˜ แƒแƒ  แƒ’แƒแƒœแƒแƒฎแƒšแƒ“แƒ”แƒ‘แƒ.

แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜

แƒ“แƒแƒแƒ›แƒแƒขแƒ”แƒ— TextWatcher (#16):

แƒ™แƒšแƒแƒกแƒ˜แƒก MainActivity: 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) {}

แƒฌแƒ•แƒ”แƒ แƒ˜ แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก?

แƒ™แƒแƒ แƒ’แƒแƒ“, แƒแƒฎแƒšแƒ แƒแƒ‘แƒกแƒแƒšแƒฃแƒขแƒฃแƒ แƒแƒ“ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก! แƒ’แƒ˜แƒšแƒแƒชแƒแƒ•แƒ—, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ“แƒแƒฌแƒ”แƒ แƒ”แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ "แƒ แƒฉแƒ”แƒ•แƒ˜แƒก แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜" แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜.

แƒฌแƒ•แƒ”แƒ แƒ˜ แƒ™แƒแƒšแƒ™แƒฃแƒšแƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ™แƒแƒขแƒšแƒ˜แƒœแƒจแƒ˜: แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก?

Skillbox แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ