рдХреЛрдЯрд▓рд┐рдирдордзреАрд▓ рдЯрд┐рдкрд╛рдВрдЪреА рдЧрдгрдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдзрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╕рд╛ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рддреЗ рдЖрдореНрд╣реА рддреБрдореНрд╣рд╛рд▓рд╛ рд╕рд╛рдВрдЧрддреЛ. рдЕрдзрд┐рдХ рддрдВрддреЛрддрдВрдд, Kotlin 1.3.21, Android 4, Android рд╕реНрдЯреБрдбрд┐рдУ 3. рд▓реЗрдЦ рдордиреЛрд░рдВрдЬрдХ рдЕрд╕реЗрд▓, рд╕рд░реНрд╡ рдкреНрд░рдердо, рдЬреЗ Android рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕рд╛рдд рддреНрдпрд╛рдВрдЪрд╛ рдкреНрд░рд╡рд╛рд╕ рд╕реБрд░реВ рдХрд░рдд рдЖрд╣реЗрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА. рд╣реЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдордзреНрдпреЗ рдХрд╛рдп рдЖрдгрд┐ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ.
рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдПрдЦрд╛рджреНрдпрд╛ рд░реЗрд╕реНрдЯреЙрд░рдВрдЯ рдХрд┐рдВрд╡рд╛ рдХреЕрдлреЗрдордзреНрдпреЗ рд╡реЗрд│ рдШрд╛рд▓рд╡рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрдгрд╛рд▒реНрдпрд╛ рдХрдВрдкрдиреАрдХрдбреВрди рдЯрд┐рдкреНрд╕рдЪреА рд░рдХреНрдХрдо рдореЛрдЬрд╛рдпрдЪреА рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛ рд╣реЗ рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░ рдЙрдкрдпреЛрдЧреА рдкрдбреЗрд▓. рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХрдЬрдг рдиреЗрд╣рдореА рд╡реЗрдЯрд░реНрд╕рдирд╛ рдЯрд┐рдк рджреЗрдд рдирд╛рд╣реА; рд╣реА рдПрдХ рдкрд╛рд╢реНрдЪрд╛рддреНрдп рдкрд░рдВрдкрд░рд╛ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЕрд╢рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛрдгрддреНрдпрд╛рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рдордиреЛрд░рдВрдЬрдХ рдЖрд╣реЗ.
рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕
"рдореЛрдмрд╛рдЗрд▓ рдбреЗрд╡реНрд╣рд▓рдкрд░ 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"/>
рдЖрддрд╛ рддреБрдореНрд╣реА рд╡реНрд╣реЕрд▓реНрдпреВ рдбрд┐рд░реЗрдХреНрдЯрд░реА рд╕реНрдЯрд╛рдИрд▓ рдХрд░реВ рд╢рдХрддрд╛ рдХрд┐рдВрд╡рд╛ рд░рдВрдЧ рд╡рд╛рдкрд░реВрди рдЦреЗрд│реВ рд╢рдХрддрд╛
рдЖрддрд╛ рдкреНрд░рдХрд▓реНрдк рдЕрд╕реЗ рджрд┐рд╕рддреЗ:
рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддрд╛, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдбреЗрдЯрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЦрд░реНрдЪрд╛рдЪреА рдЧрдгрдирд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ.
рд▓реЗрдЦрд╛ рд╡рд┐рднрд╛рдЧрд╛рдЪрд╛ рд╡рд┐рдХрд╛рд╕
рдЦрд░реНрдЪ рд╡рд┐рднрд╛рдЧ (#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"/>
рд░реЗрд╕реНрдЯреЙрд░рдВрдЯ рдореЗрд│рд╛рд╡реНрдпрд╛рддреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рд╕рд╣рднрд╛рдЧреАрд╕рд╛рдареА рд╡реИрдпрдХреНрддрд┐рдХ рдЦрд░реНрдЪрд╛рдЪреА рдЧрдгрдирд╛ рдХрд░рдгреЗ рд╣реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЕрд╕рд▓реНрдпрд╛рдиреЗ, costPerPersonTextView рд╣реА рдореБрдЦреНрдп рднреВрдорд┐рдХрд╛ рдмрдЬрд╛рд╡рддреЗ.
EditText рдЗрдирдкреБрдЯрд▓рд╛ рдПрдХрд╛ рдУрд│реАрдкрд░реНрдпрдВрдд рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рддреЗ, рд╣реЗ рдкреЕрд░рд╛рдореАрдЯрд░ NumberDecimal inputType рд╡рд░ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
рдЖрдореНрд╣реА рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдкреНрд░рдХрд▓реНрдк рд▓рд╛рдБрдЪ рдХрд░рддреЛ рдЖрдгрд┐ рд╕рд╛рдорд╛рдиреНрдп рдиреБрдХрд╕рд╛рди (рддреБрдЯрд▓реЗрд▓реЗ рдХрдк, рдкреНрд▓реЗрдЯреНрд╕ рдЗ.) рд╕рд╛рдареА рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рддреЛ.
"рд▓реЛрдХ рдЖрдгрд┐ рдЯрд┐рдкрд╛" рд╡рд┐рднрд╛рдЧрд╛рдЪрд╛ рд╡рд┐рдХрд╛рд╕
рдЯрд┐рдк рд╡реНрд╣реЙрд▓реНрдпреВрдо рдирд┐рд╡рдб рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА, рдЦрд╛рд▓реАрд▓ рдХреЛрдб рдирд╡реАрди рд▓рд┐рдирд┐рдпрд░рд▓реЗрдЖрдЙрдЯ рд╡рд┐рднрд╛рдЧрд╛рдд рдкреЗрд╕реНрдЯ рдХрд░рд╛ (#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 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
}
рдмрдЯрдгреЗ рдкреВрд░реНрдг рдХрд░рдд рдЖрд╣реЗ
рдмрдЯрдг рдХреНрд▓рд┐рдХрд╕рд╛рдареА рд╕рдорд░реНрдерди рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рд╡рд░реНрдЧ рд╕реНрддрд░рд╛рд╡рд░ 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() {
тАж
}
рдЪрд▓рд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓рд╛рдБрдЪ рдХрд░реВрдпрд╛. рддреЗ рдЫрд╛рди рджрд┐рд╕рддреЗ рдЖрдгрд┐ рдХрд╛рд░реНрдп рдХрд░рддреЗ. рдкрдг рддреЗ рдЕрдзрд┐рдХ рдЪрд╛рдВрдЧрд▓реЗ рдЕрд╕реВ рд╢рдХрддреЗ.
рдЬрд░ рддреБрдореНрд╣реА рдмрд┐рд▓рд╛рдЪреА рд░рдХреНрдХрдо рдХрд╛рдвреВрди рдЯрд╛рдХрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓рд╛ рдЖрдгрд┐ рдирдВрддрд░ рдЯрд┐рдкреНрд╕ рдХрд┐рдВрд╡рд╛ рдорд┐рддреНрд░рд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдврд╡рд▓реА, рддрд░ рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реЕрд╢ рд╣реЛрдИрд▓ рдХрд╛рд░рдг рд╢реВрдиреНрдп рдХрд┐рдВрдордд рдореВрд▓реНрдпрд╛рд╕рд╛рдареА рдЕрджреНрдпрд╛рдк рдХреЛрдгрддреЗрд╣реА рдЪреЗрдХ рдирд╛рд╣реА. рд╢рд┐рд╡рд╛рдп, рддреБрдореНрд╣реА рдмрд┐рд▓рд╛рдЪреА рд░рдХреНрдХрдо рдмрджрд▓рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХреЗрд▓реНрдпрд╛рд╕, рд╢реБрд▓реНрдХ рдЕрдкрдбреЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА.
рдЕрдВрддрд┐рдо рдЯрдкреНрдкреЗ
TextWatcher рдЬреЛрдбрд╛ (#16):
рд╡рд░реНрдЧ рдореБрдЦреНрдп рдХреНрд░рд┐рдпрд╛рдХрд▓рд╛рдк: AppCompatActivity(), View.OnClickListener, TextWatcher {
рдордЧ рдЖрдореНрд╣реА billEditText рд╢реНрд░реЛрддрд╛ (#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) {}
рдмрд░рдВ, рдЖрддрд╛ рдкреВрд░реНрдгрдкрдгреЗ рд╕рд░реНрд╡рдХрд╛рд╣реА рдХрд╛рд░реНрдп рдХрд░рддреЗ! рдЕрднрд┐рдирдВрджрди, рддреБрдореНрд╣реА рдХреЛрдЯрд▓рд┐рдирдордзреНрдпреЗ рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ тАЬрдЯрд┐рдк рдХреЕрд▓реНрдХреНрдпреБрд▓реЗрдЯрд░тАЭ рд▓рд┐рд╣рд┐рд▓реЗ рдЖрд╣реЗ.
рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:
- рджреЛрди рд╡рд░реНрд╖рд╛рдВрдЪрд╛ рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕
"рдореА рд╡реЗрдм рдбреЗрд╡реНрд╣рд▓рдкрд░ рдкреНрд░реЛ рдЖрд╣реЗ" .- рдСрдирд▓рд╛рдИрди рдХреЛрд░реНрд╕
"C# рд╡рд┐рдХрд╕рдХ" .- рдПрдХ рд╡рд░реНрд╖рд╛рдЪрд╛ рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕
"PHP рд╡рд┐рдХрд╕рдХ 0 рддреЗ PRO" .
рд╕реНрддреНрд░реЛрдд: www.habr.com