เช
เชฎเซ เชคเชฎเชจเซ เชเชนเซเช เชเซเช เชเซ เชเซเชเชฒเชฟเชจเชฎเชพเช เชเซเชชเซเชธเชจเซ เชเชฃเชคเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ เชเช เชธเชฐเชณ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเซเชตเซ เชฐเซเชคเซ เชฌเชจเชพเชตเชตเซ. เชตเชงเซ เชธเซเชชเชทเซเช เชฐเซเชคเซ, เชเซเชเชฒเชฟเชจ 1.3.21, เชเชจเซเชกเซเชฐเซเชเชก 4, เชเชจเซเชกเซเชฐเซเชเชก เชธเซเชเซเชกเชฟเชฏเซ 3. เช เชฒเซเช เชฐเชธเชชเซเชฐเชฆ เชฐเชนเซเชถเซ, เชธเซ เชชเซเชฐเชฅเชฎ, เชเซเช เชเชจเซเชกเซเชฐเซเชเชก เชเชชเซเชฒเชฟเชเซเชถเชจ เชกเซเชตเชฒเชชเชฎเซเชจเซเชเชฎเชพเช เชคเซเชฎเชจเซ เชฎเซเชธเชพเชซเชฐเซ เชถเชฐเซ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซ. เชคเซ เชคเชฎเชจเซ เชเชชเซเชฒเชฟเชเซเชถเชจเชจเซ เช
เชเชฆเชฐ เชถเซเช เช
เชจเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ เชคเซ เชธเชฎเชเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ.
เช เชเซเชฒเซเชเซเชฏเซเชฒเซเชเชฐ เชคเซเชฏเชพเชฐเซ เชเชพเชฎเชฎเชพเช เชเชตเชถเซ เชเซเชฏเชพเชฐเซ เชคเชฎเชพเชฐเซ เชฐเซเชธเซเชเซเชฐเชจเซเช เช
เชฅเชตเชพ เชเซเชซเซเชฎเชพเช เชธเชฎเชฏ เชตเชฟเชคเชพเชตเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเชคเซ เชเชเชชเชจเซเชจเซ เชเซเชชเซเชธเชจเซ เชฐเชเชฎเชจเซ เชเชฃเชคเชฐเซ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ. เช
เชฒเชฌเชคเซเชค, เชฆเชฐเซเช เชเชฃ เชนเชเชฎเซเชถเชพ เชตเซเชเชเชฐเซเชธเชจเซ เชเซเชช เชเซเชกเชคเซเช เชจเชฅเซ; เช เชเช เชชเชถเซเชเชฟเชฎเซ เชชเชฐเชเชชเชฐเชพ เชเซ, เชชเชฐเชเชคเซ เชเชตเซ เชเชชเซเชฒเชฟเชเซเชถเชจ เชตเชฟเชเชธเชพเชตเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเซเชเชชเชฃ เชธเชเชเซเชเซเชฎเชพเช เชฐเชธเชชเซเชฐเชฆ เชเซ.
เช เชฎเซ เชฏเชพเชฆ เชเชฐเชพเชตเซเช เชเซเช: Habrเชจเชพ เชคเชฎเชพเชฎ เชตเชพเชเชเซ เชฎเชพเชเซ - Habr เชชเซเชฐเซเชฎเซ เชเซเชกเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเชเชชเชฃ เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชเซเชฐเซเชธเชฎเชพเช เชจเซเชเชงเชฃเซ เชเชฐเชคเซ เชตเชเชคเซ 10 เชฐเซเชฌเชฒ เชกเชฟเชธเซเชเชพเชเชจเซเช.
เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชญเชฒเชพเชฎเชฃ เชเชฐเซ เชเซ: เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"เชฎเซเชฌเชพเชเชฒ เชกเซเชตเชฒเชชเชฐ เชชเซเชฐเซ .
เชเชชเชฐเซเชถเชจเชฎเชพเช เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ:
เชคเชฎเซ เชเซเชฒ เชฐเชเชฎเชจเซ เชเชเซเชเชฟเชค เชเชเชพเชตเชพเชฐเซ, เชฎเซเชเชฟเชเชเชฎเชพเช เชญเชพเช เชฒเซเชจเชพเชฐเชพเชเชจเซ เชธเชเชเซเชฏเชพ เชฆเชพเชเชฒ เชเชฐเซ เช
เชจเซ เชชเชฐเชฟเชฃเชพเชฎ เชฎเซเชณเชตเซ - เชคเชฎเชพเชฐเซ เชเซ เชเซเชช เชเซเชกเชตเซ เชเซเชเช.
เชชเซเชฐเชพเชฐเชเชญ
เชธเชเชชเซเชฐเซเชฃ เชเชชเซเชฒเชฟเชเซเชถเชจ เชเชจเซเชเชฐเชซเซเชธ เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ:
เชชเซเชฐเชฅเชฎ เชเซเชฐเชฟเชฏเชพ -
เชฌเชงเซเช เชธเซเชชเชทเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพเชจเซ เชเซเชฐเชฟเชฏเชพเช เชเชพเชฒเชเซเชฐเชฎเชฟเช เชเซเชฐเชฎเชฎเชพเช เชชเซเชฐเซเชเซเชเซเชเชฎเชพเช เชฒเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชคเซเชจเซ เชเซเชตเชพ เชฎเชพเชเซ, View -> Tool Windows -> TODO เชเซเชฒเซ.
เช เชฎเซ เชชเซเชฐเซเชเซเชเซเชเชจเซ เช เชญเซเชฏเชพเชธ เชเชฐเซเช เชเซเช เช เชจเซ เชเชฒเชฐ เชชเซเชฒเซเชเชจเซเช เชฎเซเชฒเซเชฏเชพเชเชเชจ เชเชฐเชตเชพ colors.xml เชเซเชฒเซเช เชเซเช. strings.xml เชฎเชพเช เชเซเชเซเชธเซเช เชกเซเชเชพ (เชธเชนเซเช) เชนเซเชฏ เชเซ, เช เชจเซ styles.xml เชฎเชพเช เชเชฃเชพ เชซเซเชจเซเช เชเซเชฎเซเชชเชฒเซเชเซเชธ เชนเซเชฏ เชเซ.
เชเชฐเซเช เชตเชฟเชญเชพเช เชตเชฟเชเชพเชธ
activity_main.xml เชเซเชฒเซ เช เชจเซ เชจเซเชเซเชจเซ เชเซเชก เชฒเซเชจเชฟเชฏเชฐเชฒเซเชเชเชเชฎเชพเช เชเชฎเซเชฐเซ (#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>
เช เชฎเซ TODO เชจเซ เชธเซเชเชฟ เชชเชเซ เชฒเซเชจเชฟเชฏเชฐเชฒเซเชเชเช เชฌเชเชง เชเชฐเซเช เชเซเช, เช เชจเซ เชชเชเซ เชคเซเชจเซ เชฒเซเชจเชฟเชฏเชฐเชฒเซเชเชเช (#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 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
}
เชฌเชเชจเซ เชธเชฎเชพเชชเซเชค
เชฌเชเชจ เชเซเชฒเชฟเช เชฎเชพเชเซ เชธเชฎเชฐเซเชฅเชจ เชเชฎเซเชฐเชตเชพ เชฎเชพเชเซ, เช เชฎเซ เชตเชฐเซเช เชธเซเชคเชฐ (#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 {
เชชเชเซ เช เชฎเซ เชฌเชฟเชฒ เชเชกเชฟเช เชเซเชเซเชธเซเช เชฒเชฟเชธเชจเชฐ (#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) {}
เชธเชพเชฐเซเช, เชนเชตเซ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชฌเชงเซเช เชเชพเชฎ เชเชฐเซ เชเซ! เช
เชญเชฟเชจเชเชฆเชจ, เชคเชฎเซ เชเซเชเชฒเชฟเชจเชฎเชพเช เชคเชฎเชพเชฐเซเช เชชเซเชคเชพเชจเซเช โเชเชฟเชช เชเซเชฒเซเชเซเชฏเซเชฒเซเชเชฐโ เชฒเชเซเชฏเซเช เชเซ.
เชธเซเชเชฟเชฒเชฌเซเชเซเชธ เชญเชฒเชพเชฎเชฃ เชเชฐเซ เชเซ:
- เชฌเซ เชตเชฐเซเชทเชจเซ เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"เชนเซเช เชตเซเชฌ เชกเซเชตเชฒเชชเชฐ เชชเซเชฐเซ เชเซเช" .- เชเชจเชฒเชพเชเชจ เชเซเชฐเซเชธ
"C# เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ" .- เชเช เชตเชฐเซเชทเชจเซ เชชเซเชฐเซเชเซเชเชฟเชเชฒ เชเซเชฐเซเชธ
"0 เชฅเซ PRO เชธเซเชงเซ PHP เชตเชฟเชเชพเชธเชเชฐเซเชคเชพ" .
เชธเซเชฐเซเชธ: www.habr.com