Π Π°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΡΠ°Π΅Π²ΡΡ
Π½Π° ΡΠ·ΡΠΊΠ΅ Kotlin. ΠΡΠ»ΠΈ ΡΠΎΡΠ½Π΅Π΅, ΡΠΎ Kotlin 1.3.21, Android 4, Android Studio 3. Π‘ΡΠ°ΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠΉ, Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π΄Π»Ρ ΡΠ΅Ρ
, ΠΊΡΠΎ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΡΠ²ΠΎΠΉ ΠΏΡΡΡ Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ Android-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΈ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π²Π½ΡΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π’Π°ΠΊΠΎΠΉ ΠΊΠ°Π»ΡΠΊΡΠ»ΡΡΠΎΡ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΡΠΈΡΠ°ΡΡ ΡΡΠΌΠΌΡ ΡΠ°Π΅Π²ΡΡ
Ρ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ, ΡΠ΅ΡΠΈΠ²ΡΠ΅ΠΉ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π²ΡΠ΅ΠΌΡ Π² ΡΠ΅ΡΡΠΎΡΠ°Π½Π΅ ΠΈΠ»ΠΈ ΠΊΠ°ΡΠ΅. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ Π²ΡΠ΅ ΠΈ Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΎΡΠΈΡΠΈΠ°Π½ΡΠ°ΠΌ Π½Π° ΡΠ°ΠΉ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅ Π·Π°ΠΏΠ°Π΄Π½Π°Ρ ΡΡΠ°Π΄ΠΈΡΠΈΡ, Π½ΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½.
ΠΠ°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ: Π΄Π»Ρ Π²ΡΠ΅Ρ ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ Β«Π₯Π°Π±ΡΠ°Β» β ΡΠΊΠΈΠ΄ΠΊΠ° 10 000 ΡΡΠ±Π»Π΅ΠΉ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π½Π° Π»ΡΠ±ΠΎΠΉ ΠΊΡΡΡ Skillbox ΠΏΠΎ ΠΏΡΠΎΠΌΠΎΠΊΠΎΠ΄Ρ Β«Π₯Π°Π±ΡΒ».
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"/>
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΡΡΠΈΠ»Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ values ΠΈΠ»ΠΈ ΠΏΠΎΠΈΠ³ΡΠ°ΡΡ Ρ ΡΠ²Π΅ΡΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ
Π‘Π΅ΠΉΡΠ°Ρ ΠΏΡΠΎΠ΅ΠΊΡ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠ°ΡΡΠ΅Ρ Π·Π°ΡΡΠ°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΠΏΠΎ Π΄Π°Π½Π½ΡΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π½ΠΎΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ°Π·Π΄Π΅Π»Π° ΡΡΠ΅ΡΠΎΠ²
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠΎΠ΄, ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅, Π² LinearLayout ΠΏΠΎΡΠ»Π΅ Expense Section (#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.
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡ Π΄Π»Ρ ΡΠ΅ΡΡΠ° ΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΡΠ΅ΡΠ±Π° (ΡΠ°Π·Π±ΠΈΡΡΠ΅ ΡΠ°ΡΠΊΠΈ, ΡΠ°ΡΠ΅Π»ΠΊΠΈ ΠΈ Ρ.ΠΏ.)
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ°Π·Π΄Π΅Π»Π° Β«ΠΡΠ΄ΠΈ ΠΈ ΡΠ°Π΅Π²ΡΠ΅Β»
Π§ΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π²ΡΠ±ΠΎΡΠ° ΠΎΠ±ΡΠ΅ΠΌΠ° ΡΠ°Π΅Π²ΡΡ , Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Π² Π½ΠΎΠ²ΡΡ ΡΠ΅ΠΊΡΠΈΡ 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 ids (subtractPeopleButton, addPeopleButton)
- TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)
- DefaultText Π΄Π»Ρ numberOfPeopleTextView (Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ 4).
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΡΡΠΌΠΌΡ ΡΡΠ΅ΡΠ°, ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Β«ΠΠΎΠ±Π°Π²ΠΈΡΡ/ΠΡΡΠ΅ΡΡΡΒ», Π½ΠΎ ΠΏΠΎΠΊΠ° Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ.
ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Views
ΠΡΠΊΡΡΠ²Π°Π΅ΠΌ 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 Π²ΡΠ΅ ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΎΡΠ΅Π½Ρ ΠΊΡΡΡΠΎ! ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ Π²ΠΎ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ increment ΠΈ decrement
(#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):
class 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Β» .- ΠΠ½Π»Π°ΠΉΠ½-ΠΊΡΡΡ
Β«Π‘#-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΒ» .- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π³ΠΎΠ΄ΠΎΠ²ΠΎΠΉ ΠΊΡΡΡ
Β«PHP-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ Ρ 0 Π΄ΠΎ PROΒ» .
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com