рд╣рдо рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдЯрд┐рдк рдЧрдгрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдЯрд▓рд┐рди 1.3.21, рдПрдВрдбреНрд░реЙрдЗрдб 4, рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ 3ред рд▓реЗрдЦ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдиреА рдпрд╛рддреНрд░рд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рдХреИрд▓рдХреБрд▓реЗрдЯрд░ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХрдВрдкрдиреА рд╕реЗ рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд░реЗрд╕реНрддрд░рд╛рдВ рдпрд╛ рдХреИрдлреЗ рдореЗрдВ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреА рд╣реИред рдмреЗрд╢рдХ, рд╣рд░ рдХреЛрдИ рдФрд░ рд╣рдореЗрд╢рд╛ рд╡реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЪрд╛рдп рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛, рдпрд╣ рдПрдХ рдкрд╢реНрдЪрд┐рдореА рдкрд░рдВрдкрд░рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
рдЕрдиреБрд╕реНрдорд╛рд░рдХ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдирд╛рдорд╛рдВрдХрди рдХрд░рддреЗ рд╕рдордп 10 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡рд▓рдкрд░ рдкреНрд░реЛ .
рдЬрдм рдпрд╣ рдРрдк рдЪрд▓ рд░рд╣рд╛ рд╣реЛ рддреЛ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рдЖрдк рдХреБрд▓ рд░рд╛рд╢рд┐ рдХрд╛ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рддрд┐рд╢рдд, рдмреИрдардХ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ - рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдЬреЛ рдЫреЛрдбрд╝реА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред
рд╢реБрд░реВ
рдРрдк рдХрд╛ рдкреВрд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
рдкреНрд░рдердо рдХреНрд░рд┐рдпрд╛ -
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдПрдБ рдХрд╛рд▓рд╛рдиреБрдХреНрд░рдорд┐рдХ рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ, рддрд╛рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реЛред рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, View -> Tool Windows -> TODO рдЦреЛрд▓реЗрдВред
рд╣рдо рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд░рдВрдЧ рдкреИрд▓реЗрдЯ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП color.xml рдЦреЛрд▓рддреЗ рд╣реИрдВред strings.xml рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рдбреЗрдЯрд╛ (рдХреИрдкреНрд╢рди) рд╣реЛрддрд╛ рд╣реИ, рдФрд░ style.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
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"/>
рдЪреВрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд░реЗрд╕реНрддрд░рд╛рдВ рдореЗрдВ рд╕рднрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд▓рд╛рдЧрдд рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЙрд╕реНрдЯрдкрд░рдкрд░реНрд╕рдирдЯреЗрдХреНрд╕реНрдЯрд╡реНрдпреВ рдореБрдЦреНрдп рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред
EditText рдЗрдирдкреБрдЯ рдХреЛ рдПрдХ рдкрдВрдХреНрддрд┐ рддрдХ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ NumberDecimal рдЗрдирдкреБрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрд▓ рдХреНрд╖рддрд┐ (рдЯреВрдЯреЗ рд╣реБрдП рдХрдк, рдкреНрд▓реЗрдЯ рдЖрджрд┐) рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВред
"рд▓реЛрдЧ рдФрд░ рдпреБрдХреНрддрд┐рдпрд╛рдБ" рдЕрдиреБрднрд╛рдЧ рдХрд╛ рд╡рд┐рдХрд╛рд╕
рдЯрд┐рдк рд░рд╛рд╢рд┐ рдЪрдпрдирдХрд░реНрддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдПрдХ рдирдП 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):
- рдЗрдореЗрдЬрдмрдЯрди рдЖрдИрдбреА (рдкреАрдкрд▓рдмрдЯрди рдШрдЯрд╛рдПрдВ, рдкреАрдкреБрд▓рдмрдЯрди рдЬреЛрдбрд╝реЗрдВ)
- рдЯреЗрдХреНрд╕реНрдЯрд╡реНрдпреВ рдЖрдИрдбреА (рдирдВрдмрд░рдСрдлрдкреАрдкрд▓рд╕реНрдЯреИрдЯрд┐рдХрдЯреЗрдХреНрд╕реНрдЯ, рдирдВрдмрд░рдСрдлрдкреАрдкрд▓рдЯреЗрдХреНрд╕реНрдЯрд╡реНрдпреВ)
- 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):
рдХреНрд▓рд╛рд╕ рдореЗрдирдПрдХреНрдЯрд┐рд╡рд┐рдЯреА: 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() {
тАж
}
рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рднреА рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ.
рдпрджрд┐ рдЖрдк рдмрд┐рд▓ рд░рд╛рд╢рд┐ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕рдВрдХреЗрдд рдпрд╛ рдорд┐рддреНрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВ, рддреЛ рдРрдк рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╢реВрдиреНрдп рд▓рд╛рдЧрдд рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдХреЛрдИ рдЪреЗрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдЪрд╛рд▓рд╛рди рд░рд╛рд╢рд┐ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢реБрд▓реНрдХ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
рдЕрдВрддрд┐рдо рдЪрд░рдг
рдЯреЗрдХреНрд╕реНрдЯрд╡реЙрдЪрд░ рдЬреЛрдбрд╝реЗрдВ (#16):
рдХреНрд▓рд╛рд╕ рдореЗрдирдПрдХреНрдЯрд┐рд╡рд┐рдЯреА: AppCompatActivity(), View.OnClickListener, TextWatcher {
рдлрд┐рд░ рд╣рдо рдмрд┐рд▓рдПрдбрд┐рдЯрдЯреЗрдХреНрд╕реНрдЯ рд╢реНрд░реЛрддрд╛ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рддреЗ рд╣реИрдВ (#17):
billEditText.addTextChangedListener(рдпрд╣)
рд╕рд╛рде рд╣реА рдЯреЗрдХреНрд╕реНрдЯрд╡реЙрдЪрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ (#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) {}
рдЦреИрд░, рдЕрдм рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдмрдзрд╛рдИ рд╣реЛ, рдЖрдкрдиреЗ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ "рдЯрд┐рдкрд┐рдВрдЧ рдХреИрд▓рдХреБрд▓реЗрдЯрд░" рд▓рд┐рдЦрд╛ рд╣реИред
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ:
- рджреЛ рд╡рд░реНрд╖реАрдп рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо
"рдореИрдВ рдПрдХ PRO рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВ" .- рдСрдирд▓рд╛рдЗрди рдкрд╛рдареНрдпрдХреНрд░рдо
"рд╕реА# рдбреЗрд╡рд▓рдкрд░" .- рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╡рд░реНрд╖ рдкрд╛рдареНрдпрдХреНрд░рдо
"PHP рдбреЗрд╡рд▓рдкрд░ 0 рд╕реЗ PRO рддрдХ" .
рд╕реНрд░реЛрдд: www.habr.com