แฉแแแ แแแขแงแแแ, แแฃ แ แแแแ แฃแแแ แจแแฅแแแแ แแแ แขแแแ แแแแแแแชแแ แแแขแแแแจแ แ แฉแแแแแแก แแแแแกแแแแแแแแ. แฃแคแ แ แแฃแกแขแแ, Kotlin 1.3.21, Android 4, Android Studio 3. แกแขแแขแแ แกแแแแขแแ แแกแ แแฅแแแแ, แแแ แแแ แ แแแจแ, แแแแแแแก, แแแแช แแฌแงแแแก แแแแแแฃแ แแแแก แแแแ แแแแแก แแแแแแแชแแแแแก แจแแแฃแจแแแแแแจแ. แแก แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแ แ แ แแ แ แแแแ แแฃแจแแแแก แแแแแแแชแแแก แจแแแแแ.
แแก แแแแแฃแแแขแแ แ แแแแแแแแแแแแ, แ แแชแ แฃแแแ แแแแแแแแแแ แ แฉแแแแแแก แ แแแแแแแแ แแแแแแแแแกแแแ, แ แแแแแแช แแแแแฌแงแแแขแก แแ แแแก แแแขแแ แแแแก แ แแกแขแแ แแแจแ แแ แแแคแแจแ. แ แ แแฅแแ แฃแแแ, แแแแขแแแแแก แงแแแแแแแแก แงแแแแ แแ แฃแขแแแแแก แฌแแแแแแก, แแก แฃแคแ แ แแแกแแแแฃแ แ แขแ แแแแชแแแ, แแแแ แแ แแกแแแ แแแแแแแชแแแก แจแแแฃแจแแแแแแก แแ แแชแแกแ แแแแแกแแแแ แจแแแแฎแแแแแจแ แกแแแแขแแ แแกแแ.
แจแแแแฎแกแแแแแ: "Habr"-แแก แงแแแแ แแแแแฎแแแแแกแแแแก - แคแแกแแแแแแแ 10 แ แฃแแแแแแ Skillbox-แแก แแแแแกแแแแ แแฃแ แกแแ แฉแแ แแชแฎแแแกแแก "Habr" แกแแ แแแแแแ แแแแแก แแแแแงแแแแแแ.
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"/>
แแฎแแ แแฅแแแ แจแแแแซแแแแ แฆแแ แแแฃแแแแแแแก แแแขแแแแแแก แกแขแแแ แแ แแแแแจแ แคแแ แแแแก แแแแแงแแแแแแ
แแฎแแ แแ แแแฅแขแ แแกแ แแแแแแงแฃแ แแแ:
แ แแแแ แช แฎแแแแแ, แฎแแ แฏแแแ แแแแแแแแแแแ แแแแฎแแแ แแแแแก แแแแ แจแแงแแแแแแ แแแแแชแแแแแแก แกแแคแฃแซแแแแแ.
แแแแแ แแจแแแแก แแแแงแแคแแแแแแก แจแแแฃแจแแแแแ
แแแแแแขแแ แฅแแแแแ แแแชแแแฃแแ แแแแ LinearLayout-แก แฎแแ แฏแแแแก แแแแงแแคแแแแแแก แจแแแแแ (#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-แก TODO-แแแแก แกแแแก แจแแแแแ, แจแแแแแ แแแแแขแแแ แแฎแแ แแแแก แแ แแแแแแกแแแ แแแก 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 ID (แแแแแแแแแPeopleButton, addPeopleButton)
- TextView ID (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):
แแแแกแ 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()
}
}
แฆแแแแแแแแกแ แแ แแแแแแ แแแแแแแแก แแฎแ แแ, แแแขแแแแ แงแแแแแคแแ แก แซแแแแแ แแแแแ แแฌแงแแแก! แแแแแแขแแ แฅแแแแแ แแแชแแแฃแแ แแแแ แงแแแแ แแแแ แแแกแ แแ แจแแแชแแ แแแแก แคแฃแแฅแชแแแแก
(#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):
แแแแกแแก MainActivity: 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) {}
แแแ แแแ, แแฎแแ แแแกแแแฃแขแฃแ แแ แงแแแแแคแแ แ แแฃแจแแแแก! แแแแแชแแแ, แแฅแแแ แแแฌแแ แแ แแฅแแแแ แกแแแฃแแแ แ "แ แฉแแแแก แแแแแฃแแแขแแ แ" แแแขแแแแจแ.
Skillbox แแแ แฉแแแ:
- แแ แฌแแแแแ แแ แแฅแขแแแฃแแ แแฃแ แกแ
"แแ แแแ แแแ แแแแแแแแแ แ PRO" .- แแแแแแ แแฃแ แกแ
"C# แแแแแแแแแ แ" .- แแ แแฅแขแแแฃแแ แฌแแแก แแฃแ แกแ
"PHP แแแแแแแแแ แ 0-แแแ PRO-แแแ" .
แฌแงแแ แ: www.habr.com