ααΎααααα αΆαα’αααααΈαααααααααΎααααααα·ααΈααααΆααααααΆααααα½αααααΆαααααα½ααα
αααα»α Kotlin α ααΎααααΈα±ααααΆααααα
αααΆααααΆαα Kotlin 1.3.21, Android 4, Android Studio 3. α’αααααααΉααα½αα±ααα
αΆααα’αΆαααααα ααΆααααΌααααααΆααα’ααααααα
αΆααααααΎαααααΎααααααα½ααααααα»αααΆαα’αα·αααααααααααα·ααΈ Android α ααΆα’αα»ααααΆαα±ααα’ααααααααΈα’αααΈααααα·ααααααααααααΎαααΆααα
αααα»ααααααα·ααΈα
αααΆαααΈααα·ααααααααααααΆααααααααααα
ααααααα’αααααααΌαααΆαααααΆα
ααα½ααααααΉαααΈαααα»αα αα»αααααααααα
α
α·αααα
αααΆαααααα
αααα»ααααααΈαααααΆαα¬α αΆαααΆα αααα ααΆααΆααα·αααΆαα αα·αααααααααααααΆαα α αΎααα·αααααααα»ααααααααΆααα’αααααααα»ααααα αααααΆααααααααααΆαααααααααααΆααα·α
ααα»ααααααααΎαααΆαααααΆααααααΎααααααα·ααΈααααααααΊαα½αα±ααα
αΆααα’αΆαααααααααα»αααααΈααΆαααααα
ααΎαααααΉαα αααααΆααα’αααα’αΆαααΆααα’αααα "Habr" - ααΆααααα α»αααααα 10 rubles αα αααα α»αααααααααα»ααααααα·ααααΆ Skillbox ααΆαα½ααααααααΎαααααΌαααααααααααΆα "Habr" α
Skillbox ααααΆαα αααααα·ααααΆααΆααααααα
"α’αααα’αα·ααααααααΌαααααα PRO .
αααααΆα’αααΈααααααααα·ααΈααΎααα ααΌα ααααααααΆαααα»αααααΎαααΆαα
α’ααααααα
αΌαααΆααααααα
ααααΆαααα
ααα½αααα»α α
ααα½αα’αααα
αΌααα½ααααα»αααΆαααααα»α αα·αααα½αααΆααααααα - α
ααα½ααααααΉαααααα½ααα»αα
ααΆαα αΆααααααΎα
α
ααα»α
αααααΆαααααααααααααααα·ααΈααΎααα
ααΌα
αααα
αααααααΆαααααΌα -
αααααααΆαααααα’αααααααΎααααΆααααααΌαααΆαααααααα
αααα»αααααααααΆαααααΆααααααα ααΌα
ααααα’αααΈαααΊα
αααΆααα ααΎααααΈααΎαααΆ ααΌαααΎα View -> Tool Windows -> TODOα
ααΎααα·ααααΆαααααα αα·αααΎα colours.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 αααααΆααααΈαααααΈ TODOs α αΎααααααΆααααααααααααΌαααααΈ αααααΆααααΆαα ααΆααααα»α 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)α
- ααααααααΆαααααΌαα»αααΌαααΆα (αααααΌαα»αααα»ααα αααΌαα»αααααααααα»ααα)
- ααααααααΆαα TextView (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)α
class 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()
}
}
αα
αααα»ααααααααααααααΌαα»ααα·ααα»αααΆαα Kotlin ααΆαα’αααΈααααααααΆααααααααΌαααΆααααα
ααααΆαα‘αΌα! ααααααααΌαααΆαααααααα
αα»αααΆααααααΎα αα·ααααααααΆααα’ααα
(#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) {}
α₯α‘αΌααααα’αααΈαααααΎαααΆαα αΎα! ααΌαα’αα’αααΆααα’αααααΆαααααα "Tipping Calculator" ααααΆαααααα½αααααα’ααααα
αααα»α Kotlin α
Skillbox ααααΆαα
- αααααα·ααααΆααΆαααααααααααααααΈαααααΆα
"αααα»αααΆα’ααααααααΎαααα ααααα PRO" .- αααααα·ααααΆααΆαα’ααΈαααΊαα·α
"α’αααα’αα·αααααα C#" .- αααααα·ααααΆααΆαααααααααααΆα
"α’αααα’αα·αααααα PHP ααΈ 0 ααα PRO" .
ααααα: www.habr.com