αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž™αžΎαž„αž”αž„αŸ’αž αžΆαž‰αž’αŸ’αž“αž€αž–αžΈαžšαž”αŸ€αž”αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αžŽαž“αžΆαž–αŸαžαŸŒαž˜αžΆαž“αž‡αŸ†αž“αž½αž™αžŠαŸαžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„ Kotlin αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž€αžΆαž“αŸ‹αžαŸ‚αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹ Kotlin 1.3.21, Android 4, Android Studio 3. αž’αžαŸ’αžαž”αž‘αž“αžΉαž„αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸ αž‡αžΆαžŠαŸ†αž”αžΌαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžŠαŸ‚αž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ†αžŽαžΎαžšαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αž˜αŸ’αž˜αžœαž·αž’αžΈ Android αŸ” αžœαžΆαž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž™αž›αŸ‹αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαŸ”

αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž”αŸ‚αž”αž“αŸαŸ‡αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αžΆαžšαž‚αžŽαž“αžΆαž…αŸ†αž“αž½αž“αž‚αž“αŸ’αž›αžΉαŸ‡αž–αžΈαž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αžŠαŸ‚αž›αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαž…αŸ†αžŽαžΆαž™αž–αŸαž›αž“αŸ…αž€αŸ’αž“αž»αž„αž—αŸ„αž‡αž“αžΈαž™αžŠαŸ’αž‹αžΆαž“αž¬αž αžΆαž„αž€αžΆαž αŸ’αžœαŸαŸ” αž‡αžΆαž€αžΆαžšαž–αž·αžαžŽαžΆαžŸαŸ‹ αž˜αž·αž“αž˜αŸ‚αž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αž“αžΆαž‘αŸ αž αžΎαž™αž˜αž·αž“αžαŸ‚αž„αžαŸ‚αž‘αž»αž€αžαŸ‚αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αžšαžαŸ‹αžαž»αž“αŸ„αŸ‡αž‘αŸ αž“αŸαŸ‡αž‡αžΆαž‘αŸ†αž“αŸ€αž˜αž‘αž˜αŸ’αž›αžΆαž”αŸ‹αžšαž”αžŸαŸ‹αž›αŸ„αž€αžαžΆαž„αž›αž·αž… αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αŸ‚αž”αž“αŸαŸ‡αž‚αžΊαž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžŽαžΆαž€αŸαžŠαŸ„αž™αŸ”

αž™αžΎαž„αžšαŸ†αž›αžΉαž€αŸ– αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αžΆαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸƒ "Habr" - αž€αžΆαžšαž”αž‰αŸ’αž…αž»αŸ‡αžαž˜αŸ’αž›αŸƒ 10 rubles αž“αŸ…αž–αŸαž›αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡αž€αŸ’αž“αž»αž„αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ Skillbox αžŽαžΆαž˜αž½αž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž›αŸαžαž€αžΌαžŠαž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™ "Habr" αŸ”

Skillbox αžŽαŸ‚αž“αžΆαŸ†αŸ– αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„ "αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž‘αžΌαžšαžŸαŸαž–αŸ’αž‘ PRO.

αž“αŸαŸ‡αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž–αŸαž›αžŠαŸ‚αž›αžœαžΆαž€αŸ†αž–αž»αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ–

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž—αžΆαž‚αžšαž™αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αž“αŸƒαž…αŸ†αž“αž½αž“αžŸαžšαž»αž” αž…αŸ†αž“αž½αž“αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ’αžšαž‡αž»αŸ† αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αž›αž‘αŸ’αž’αž•αž› - αž…αŸ†αž“αž½αž“αž‚αž“αŸ’αž›αžΉαŸ‡αžŠαŸ‚αž›αž‚αž½αžšαž‘αž»αž€αŸ”

αž€αžΆαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜

αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž–αŸαž‰αž›αŸαž‰αž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–
αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαŸ†αž”αžΌαž„ - αž€αžΆαžšαž‘αžΆαž‰αž™αž€αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‚αž˜αŸ’αžšαŸ„αž„. αž”αžΎαž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„ Android Studio 3.0 αž¬αžαŸ’αž˜αžΈαž‡αžΆαž„αž“αŸαŸ‡αŸ” αž™αžΎαž„αžŸαžΆαž„αžŸαž„αŸ‹ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‚αž˜αŸ’αžšαŸ„αž„ αž αžΎαž™αžƒαžΎαž‰αž’αŸαž€αŸ’αžšαž„αŸ‹αž–αžŽαŸŒαžŸαŸ” αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž›αŸ’αž’αžŠαžΌαž…αžŠαŸ‚αž›αžœαžΆαž‚αž½αžšαžαŸ‚αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžšαžŸαŸαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžαžΆαž˜αž›αŸ†αžŠαžΆαž”αŸ‹αž›αŸ†αžŠαŸ„αž™ αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž’αŸ’αžœαžΈαŸ—αž‚αžΊαž…αŸ’αž”αžΆαžŸαŸ‹αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αžœαžΆ αžŸαžΌαž˜αž”αžΎαž€ View -> Tool Windows -> TODOαŸ”

αž™αžΎαž„αžŸαž·αž€αŸ’αžŸαžΆαž‚αž˜αŸ’αžšαŸ„αž„ αž“αž·αž„αž”αžΎαž€ colours.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.

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž‚αž˜αŸ’αžšαŸ„αž„αž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?
αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰αž€αžΆαžšαž‚αžŽαž“αžΆαžαŸ’αž›αŸƒαžŠαžΎαž˜αž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎαž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž…αžΌαž›αžŠαŸ„αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž•αŸ’αž“αŸ‚αž€αž‚αžŽαž“αžΈ

αž”αž“αŸ’αžαŸ‚αž˜αž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‘αŸ… 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 αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž‰αŸ’αž‡αžΈ TODOs αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž”αž“αŸ’αžαŸ‚αž˜αž€αžΌαžŠαžαŸ’αž˜αžΈ αžŠαŸ„αž™αžŠαžΆαž€αŸ‹αžœαžΆαž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ 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αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?
αž™αžΎαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αž˜αŸ’αžšαŸ„αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αž αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž“αŸƒαž€αžΆαžšαžαžΌαž…αžαžΆαžαžŸαžšαž»αž” (αž–αŸ‚αž„αžŠαŸ‚αž›αžαžΌαž… αž…αžΆαž“αŸ”αž›αŸ”)

αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž•αŸ’αž“αŸ‚αž€ "αž˜αž“αž»αžŸαŸ’αžŸαž“αž·αž„αž–αŸαžαŸŒαž˜αžΆαž“αž‡αŸ†αž“αž½αž™"

αžŠαžΎαž˜αŸ’αž”αžΈαž”αž“αŸ’αžαŸ‚αž˜αž§αž”αž€αžšαžŽαŸαž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαž…αŸ†αž“αž½αž“αž‘αžΉαž€αž”αŸ’αžšαžΆαž€αŸ‹αž‡αŸ†αž“αž½αž™ αžŸαžΌαž˜αž”αž·αž‘αž—αŸ’αž‡αžΆαž”αŸ‹αž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‘αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€ 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 (numberOfPeopleStaticText, numberOfPeopleTextView)
  • αž’αžαŸ’αžαž”αž‘αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ numberOfPeopleTextView (αž‚αž½αžšαžαŸ‚αž‡αžΆ 4) αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αžœαžΆαž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž…αŸ†αž“αž½αž“αžœαž·αž€αŸ’αž€αž™αž”αžαŸ’αžšαž”αžΆαž“ αž”αŸŠαžΌαžαž»αž„αž”αž“αŸ’αžαŸ‚αž˜/αžŠαž€αž€αŸαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŠαŸ‚αžš αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αž“αŸαŸ‡αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαž€αžΎαžαž‘αžΎαž„αž‘αŸαŸ”

αž”αž“αŸ’αžαŸ‚αž˜αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–

ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ 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)αŸ–

class 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()
        }
    }

αž“αŸ…αž€αŸ’αž“αž»αž„αž›αž€αŸ’αžαžαžŽαŸ’αžŒαž“αŸƒαž”αŸŠαžΌαžαž»αž„αž“αž·αž„αž€αž»αž„αžαžΆαž€αŸ‹ Kotlin αž˜αžΆαž“αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαŸ€αž”αž…αŸ†αž™αŸ‰αžΆαž„αž‘αžΌαž™! αž”αž“αŸ’αžαŸ‚αž˜αž€αžΌαžŠαžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž‘αŸ…αž˜αž»αžαž„αžΆαžšαž”αž„αŸ’αž€αžΎαž“ αž“αž·αž„αž”αž“αŸ’αžαž™αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”
(#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
}

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž€αžΆαžšαžαžΌαž…αžαžΆαžαžŸαžšαž»αž” αž‚αž“αŸ’αž›αžΉαŸ‡ αž“αž·αž„αž…αŸ†αž“αž½αž“αž’αŸ’αž“αž€αž…αžΌαž›αžšαž½αž˜αž€αž·αž…αŸ’αž…αž”αŸ’αžšαž‡αž»αŸ†αŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αžœαžΈαžŠαŸ‚αž›αžŸαŸ†αžαžΆαž“αŸ‹αž”αŸ†αž•αž»αž ...

αž•αŸ’αž“αŸ‚αž€αž…αŸ†αžŽαžΆαž™

αž›αŸαžαž€αžΌαžŠαž“αŸαŸ‡αž‚αžŽαž“αžΆαžαŸ’αž›αŸƒαžŠαžΎαž˜ (#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 {

Π—Π°Ρ‚Π΅ΠΌ встраиваСм ΡΠ»ΡƒΡˆΠ°Ρ‚Π΅Π»ΡŒ 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) {}

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž’αŸ’αžœαžΈαŸ—αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž αžΎαž™! αžŸαžΌαž˜αž’αž”αž’αžšαžŸαžΆαž‘αžšαž’αŸ’αž“αž€αž”αžΆαž“αžŸαžšαžŸαŸαžš "Tipping Calculator" αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž“αŸ…αž€αŸ’αž“αž»αž„ Kotlin αŸ”

αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‚αž·αžαž›αŸαžαž“αŸ… KotlinαŸ– αžαžΎαžœαžΆαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž™αŸ‰αžΆαž„αžŠαžΌαž…αž˜αŸ’αžαŸαž…?

Skillbox αžŽαŸ‚αž“αžΆαŸ†αŸ–

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹