рд╣рд╛рдореА рддрдкрд╛рдИрдВрд▓рд╛рдИ Kotlin рдорд╛ рд╕реБрдЭрд╛рд╡рд╣рд░реВ рдЧрдгрдирд╛ рдЧрд░реНрди рд╕рд░рд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕рд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдмрддрд╛рдЙрдБрдЫреМрдВред рдердк рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛, рдХреЛрдЯрд▓рд┐рди 1.3.21, рдПрдиреНрдбреНрд░реЛрдЗрдб 4, рдПрдиреНрдбреНрд░реЛрдЗрдб рд╕реНрдЯреБрдбрд┐рдпреЛ 3ред рд▓реЗрдЦ рд░реЛрдЪрдХ рд╣реБрдиреЗрдЫ, рд╕рдмреИ рднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рдПрдиреНрдбреНрд░реЛрдЗрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕рдорд╛ рдЖрдлреНрдиреЛ рдпрд╛рддреНрд░рд╛ рд╕реБрд░реБ рдЧрд░реНрдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ред рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рднрд┐рддреНрд░ рдХреЗ рд░ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗрд░ рдмреБрдЭреНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред
рд░реЗрд╕реНрдЯреБрд░реЗрдиреНрдЯ рд╡рд╛ рдХреНрдпрд╛рдлреЗрдорд╛ рд╕рдордп рдмрд┐рддрд╛рдЙрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдиреЗ рдХрдореНрдкрдиреАрдмрд╛рдЯ рд╕реБрдЭрд╛рд╡рд╣рд░реВрдХреЛ рдорд╛рддреНрд░рд╛ рдЧрдгрдирд╛ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдБрджрд╛ рдпреЛ рдХреНрдпрд╛рд▓рдХреБрд▓реЗрдЯрд░ рдХрд╛рдордорд╛ рдЖрдЙрдиреЗрдЫред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╕рдмреИрд▓реЗ рд╕рдзреИрдВ рд╡реЗрдЯрд░рд╣рд░реВрд▓рд╛рдИ рдЯрд┐рдк рдЫреЛрдбреНрджреИрдирдиреН; рдпреЛ рдПрдХ рдкрд╢реНрдЪрд┐рдореА рдкрд░рдореНрдкрд░рд╛ рд╣реЛ, рддрд░ рдпрд╕реНрддреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреБрдиреИ рдкрдирд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд░реЛрдЪрдХ рдЫред
рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред
Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"рдореЛрдмрд╛рдЗрд▓ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдкреНрд░реЛ .
рдпреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рдЮреНрдЪрд╛рд▓рдирдорд╛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:
рддрдкрд╛рдИрдВрд▓реЗ рдХреБрд▓ рд░рдХрдордХреЛ рдЗрдЪреНрдЫрд┐рдд рдкреНрд░рддрд┐рд╢рдд, рдмреИрдардХ рд╕рд╣рднрд╛рдЧреАрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН - рддрдкрд╛рдИрдВрд▓реЗ рдЫреЛрдбреНрдиреБрдкрд░реНрдиреЗ рдЯрд┐рдкрдХреЛ рдорд╛рддреНрд░рд╛ред
рд╕реБрд░реБ рдЧрд░реНрджреИ
рдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЗрдиреНрдЯрд░рдлреЗрд╕ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:
рдкрд╣рд┐рд▓реЛ рдХрд╛рд░реНрдп -
рд╕рдмреИ рдХреБрд░рд╛ рд╕реНрдкрд╖реНрдЯ рдмрдирд╛рдЙрди рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдХрд╛рд▓рдХреНрд░рдорд╛рдиреБрд╕рд╛рд░ рд▓реЗрдЦрд┐рдПрдХрд╛ рдЫрдиреНред рдпрд╕рд▓рд╛рдИ рд╣реЗрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, 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"/>
рдЕрдм рддрдкрд╛рдИрдВ рдорд╛рди рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реА рд╢реИрд▓реА рд╡рд╛ рд░рдВрдЧ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЦреЗрд▓реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ
рдЕрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ:
рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреЗ рд░реВрдкрдорд╛, рд▓рд╛рдЧрддрд╣рд░реВ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдбреЗрдЯрд╛рдХреЛ рдЖрдзрд╛рд░рдорд╛ рдЧрдгрдирд╛ рдЧрд░рд┐рдиреНрдЫред
рд▓реЗрдЦрд╛ рдЦрдгреНрдбрдХреЛ рд╡рд┐рдХрд╛рд╕
рддрд▓рдХреЛ рдХреЛрдбрд▓рд╛рдИ рд╡реНрдпрдп рдЦрдгреНрдб (#2) рдкрдЫрд┐ LinearLayout рдорд╛ рдердкреНрдиреБрд╣реЛрд╕реН:
<LinearLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_orientation="vertical"
android_background="@color/colorAccent">
<! тАФ TODO #3: Build Bill Section тЖТ
тАж
</LinearLayout>
рд╣рд╛рдореА TODOs рдХреЛ рд╕реВрдЪреА рдкрдЫрд┐ 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 рд╣реЛред рдЫрд╡рд┐ рдмрдЯрдирд╣рд░реВ рд▓реЗрдЦреНрдиреЗ рдЕрдиреБрдорддрд┐ рднрдПрдХреЛ рдлреЛрд▓реНрдбрд░рдорд╛ рдЖрдЗрдХрдирд╣рд░реВ рдкреНрд░рджрд╛рди рдЧрд░рд┐рдиреНрдЫред
рдЦрдгреНрдб рдкреВрд░реНрдг рд░реВрдкрдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдирд┐рдореНрди рдердкреНрдиреБрд╣реЛрд╕реН (#5):
- ImageButton ids (subtractPeopleButton, AddPeopleButton)
- TextView ids(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
}
рдмрдЯрдирд╣рд░реВ рд╕рдорд╛рдкреНрдд рдЧрд░реНрджреИ
рдмрдЯрди рдХреНрд▓рд┐рдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдорд░реНрдерди рдердкреНрди, рд╣рд╛рдореА рдХрдХреНрд╖рд╛ рд╕реНрддрд░ (#7) рдорд╛ View.OnClickListener рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВ:
рд╡рд░реНрдЧ рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐: 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):
рд╡рд░реНрдЧ рдореБрдЦреНрдп рдЧрддрд┐рд╡рд┐рдзрд┐: 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 рдорд╛ рдЖрдлреНрдиреЛ "рдЯрд┐рдк рдХреНрдпрд╛рд▓реНрдХреБрд▓реЗрдЯрд░" рд▓реЗрдЦреНрдиреБрднрдПрдХреЛ рдЫред
Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:
- рджреБрдИ рд╡рд░реНрд╖реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"рдо рдПрдХ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдкреНрд░реЛ рд╣реБрдБ" .- рдЕрдирд▓рд╛рдЗрди рдХреЛрд░реНрд╕
"C# рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛" .- рдПрдХ рд╡рд░реНрд╖рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"0 рджреЗрдЦрд┐ PRO рдорд╛ PHP рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛" .
рд╕реНрд░реЛрдд: www.habr.com