ΠΠΎΠΊΠ°Π·Π²Π°ΠΌΠ΅ Π²ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Π±Π°ΠΊΡΠΈΡΠΈ Π² Kotlin. ΠΠ° Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎ-ΡΠΎΡΠ½ΠΈ, Kotlin 1.3.21, Android 4, Android Studio 3. Π‘ΡΠ°ΡΠΈΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΠΏΡΠ΅Π΄ΠΈ Π²ΡΠΈΡΠΊΠΎ Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Π·Π°ΠΏΠΎΡΠ²Π°Ρ ΡΠ²ΠΎΠ΅ΡΠΎ ΠΏΡΡΡΠ²Π°Π½Π΅ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π° Android. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π²ΠΈ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠΈ Π²ΡΡΡΠ΅ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
Π’Π°ΠΊΡΠ² ΠΊΠ°Π»ΠΊΡΠ»Π°ΡΠΎΡ Π΅ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π±Π°ΠΊΡΠΈΡΠΈΡΠ΅ ΠΎΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠ΅ΡΠΈ Π΄Π° ΠΏΡΠ΅ΠΊΠ°ΡΠ° Π²ΡΠ΅ΠΌΠ΅ Π² ΡΠ΅ΡΡΠΎΡΠ°Π½Ρ ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ΅Π½Π΅. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π½Π΅ Π²ΡΠ΅ΠΊΠΈ ΠΈ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΎΡΡΠ°Π²Ρ ΡΠ°ΠΉ Π½Π° ΡΠ΅ΡΠ²ΠΈΡΡΠΎΡΠΈΡΠ΅, ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-ΡΠΊΠΎΡΠΎ Π·Π°ΠΏΠ°Π΄Π½Π° ΡΡΠ°Π΄ΠΈΡΠΈΡ, Π½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°ΠΊΠΎΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΡΠ»ΡΡΠ°ΠΉ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½.
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅ Π²ΠΈ: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡΠΎΠΌΠΎΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° "Habr".
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ
βΠΠΎΠ±ΠΈΠ»Π΅Π½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ PRO .
ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ:
ΠΡΠ²Π΅ΠΆΠ΄Π°ΡΠ΅ ΠΆΠ΅Π»Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Π½Ρ ΠΎΡ ΠΎΠ±ΡΠ°ΡΠ° ΡΡΠΌΠ°, Π±ΡΠΎΡ Π½Π° ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π² ΡΡΠ΅ΡΠ°ΡΠ° ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° - ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π±Π°ΠΊΡΠΈΡΠΈ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΡΠ°Π²ΠΈΡΠ΅.
ΠΡΡΠ²ΠΈ ΡΡΡΠΏΠΊΠΈ
ΠΡΠ»Π½ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
ΠΡΡΠ²ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ -
ΠΠ΅ΠΉΡΡΠ²ΠΈΡΡΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΡΠ° Π·Π°ΠΏΠΈΡΠ°Π½ΠΈ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² Ρ
ΡΠΎΠ½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅Π½ ΡΠ΅Π΄, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π΄Π° Π΅ ΡΡΠ½ΠΎ. ΠΠ° Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΎΡΠ²ΠΎΡΠ΅ΡΠ΅ 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"/>
Π‘Π΅Π³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠΈΠ»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° ΡΡΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ³ΡΠ°Π΅ΡΠ΅ Ρ ΡΠ²Π΅ΡΠΎΠ²Π΅, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅
Π‘Π΅Π³Π° ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΊΠ°:
ΠΠ°ΠΊΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·Ρ
ΠΎΠ΄ΠΈΡΠ΅ ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π²Π° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅, Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ.
Π Π°Π·ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΠΈΡΡΠ° Π·Π° Π°ΠΊΠ°ΡΠ½Ρ
ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΊΠΎΠ΄Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρ ΠΊΡΠΌ 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 ΡΠ»Π΅Π΄ ΡΠΏΠΈΡΡΠΊΠ° ΡΡΡ Π·Π°Π΄Π°ΡΠΈ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ Π½ΠΎΠ²ΠΈΡ ΠΊΠΎΠ΄, ΠΊΠ°ΡΠΎ Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π²ΡΡΡΠ΅ Π² 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 (ΠΈΠ·Π²Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° PeopleButton, Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° PeopleButton)
- TextView ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΈ (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()
}
}
ΠΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° Π±ΡΡΠΎΠ½ΠΈΡΠ΅ ΠΈ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°ΡΠ΅Π»ΠΈΡΠ΅, 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
}
ΠΠ΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΎΠ±ΡΠΈ ΡΠ΅ΡΠΈ, ΡΡΠ²Π΅ΡΠΈ ΠΈ Π±ΡΠΎΡ Π½Π° ΡΡΠ°ΡΡΠ½ΠΈΡΠΈΡΠ΅ Π² ΡΡΠ΅ΡΠ°ΡΠ°. Π, ΡΠ΅Π³Π° Π½Π°ΠΉ-Π²Π°ΠΆΠ½ΠΎΡΠΎ...
Π Π°Π·Π΄Π΅Π» Π·Π° ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅
Π’ΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅ (#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(this)
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΊΠΎΠ΄ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° 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.
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°:
- ΠΠ²ΡΠ³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ
βΠΠ· ΡΡΠΌ PRO ΡΠ΅Π± ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡβ .- ΠΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
"C# ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ" .- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΊΡΡΡ
βPHP ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡ 0 Π΄ΠΎ PROβ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com