Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Biz sizga Kotlin-da oddiy maslahatlarni hisoblash dasturini qanday yaratishni ko'rsatamiz. Aniqroq qilib aytadigan bo'lsak, Kotlin 1.3.21, Android 4, Android Studio 3. Maqola, birinchi navbatda, Android ilovalarini ishlab chiqishda o'z sayohatini boshlaganlar uchun qiziqarli bo'ladi. Bu sizga ilova ichida nima va qanday ishlashini tushunish imkonini beradi.

Bunday kalkulyator restoran yoki kafeda vaqt o'tkazishga qaror qilgan kompaniyadan maslahatlar miqdorini hisoblash kerak bo'lganda foydalidir. Albatta, har kim ham emas va har doim ham ofitsiantlar uchun choy qoldirmaydi, bu ko'proq G'arb an'anasidir, ammo bunday dasturni ishlab chiqish jarayoni har qanday holatda ham qiziqarli.

Sizga eslatib o'tamiz: "Habr" ning barcha o'quvchilari uchun - "Habr" promo-kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.

Skillbox tavsiya qiladi: Amaliy kurs "Mobil dasturchi PRO.

Ilova ishlayotgan paytda qanday ko'rinishga ega:

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Siz umumiy miqdorning kerakli foizini, yig'ilish ishtirokchilari sonini kiritasiz va natijani olasiz - qoldirish kerak bo'lgan maslahatlar miqdori.

Ishga kirishish

Ilovaning to'liq interfeysi quyidagicha ko'rinadi:
Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Birinchi harakat - Loyiha bazasi yuklab olish. Uni Android Studio 3.0 yoki undan keyingi versiyalarida oching. Biz loyihani quramiz va ishga tushiramiz va oq ekranni ko'ramiz. Hammasi yaxshi, xuddi shunday bo'lishi kerak.

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Loyihada foydalanuvchi harakatlari xronologik tartibda yoziladi, shunda hamma narsa aniq bo'ladi. Uni ko'rish uchun View -> Tool Windows -> TODO ni oching.

Biz loyihani o'rganamiz va ranglar palitrasini baholash uchun colors.xml ni ochamiz. strings.xml matn ma'lumotlarini (taglavhalarni) o'z ichiga oladi va styles.xml bir nechta shrift shablonlarini o'z ichiga oladi.

Xarajatlar bo'limini ishlab chiqish

activity_main.xml faylini oching va quyidagi kodni LinearLayout (#1) ga qo'shing:

<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"/>

Endi siz qiymatlar katalogini uslublashingiz yoki ranglar bilan o'ynashingiz mumkin material.io vositasi.

Endi loyiha quyidagicha ko'rinadi:

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?
Ko'rib turganingizdek, xarajatlarni hisoblash foydalanuvchi tomonidan kiritilgan ma'lumotlarga asoslanadi.

Hisob bo'limini ishlab chiqish

Xarajatlar bo'limidan (№2) keyin LinearLayout-ga quyidagi kodni qo'shing:

<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'lar ro'yxatidan keyin LinearLayout-ni yoping va keyin uni LinearLayout ichiga qo'yib, yangi kodni qo'shing (№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"/>

Ilovaning asosiy vazifasi restorandagi yig'ilishlarning har bir ishtirokchisi uchun individual xarajatlarni hisoblash bo'lganligi sababli, costPerPersonTextView asosiy rol o'ynaydi.

EditText kiritishni bitta satr bilan cheklaydi, bu parametr NumberDecimal inputType ga o'rnatilishi kerak.

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?
Biz loyihani sinovdan o'tkazishni boshlaymiz va umumiy zarar parametrlarini kiritamiz (singan stakanlar, plitalar va boshqalar).

"Odamlar va maslahatlar" bo'limini ishlab chiqish

Maslahat miqdori tanlagichini qo'shish uchun quyidagi kodni yangi LinearLayout bo'limiga joylashtiring (№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>

Ushbu kod qismi maslahat miqdorini to'g'ri hisoblash uchun talab qilinadi. Standart matn qiymati 20. ImageButtons yozish ruxsati bilan jilddagi piktogramma bilan taʼminlangan.

Butun qismdan nusxa oling va quyidagini qo'shing (№5):

  • ImageButton identifikatorlari (subtractPeopleButton, addPeopleButton)
  • TextView identifikatorlari (numberOfPeopleStaticText, numberOfPeopleTextView)
  • numberOfPeopleTextView uchun DefaultText (4 bo'lishi kerak).

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Endi, dasturni ishga tushirayotganda, hisob-faktura miqdorini qo'shish mumkin, Qo'shish / Ayirish tugmalari ham ishlaydi, ammo hozircha hech narsa sodir bo'lmaydi.

Ko'rishlar qo'shish

MainActivity.kt ni oching va buni initViews funksiyasiga qo'shing (#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
 
}

Tugmalarni tugatish

Tugmani bosish uchun qo'llab-quvvatlashni qo'shish uchun View.OnClickListener dasturini sinf darajasida (#7) qo'llang:

sinf MainActivity: AppCompatActivity(), View.OnClickListener {

Loyihani hozirda kompilyatsiya qilish ishlamaydi, siz yana bir necha qadamlarni bajarishingiz kerak (# 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()
        }
    }

Tugmalar va kalitlarga kelsak, Kotlinda hamma narsa juda zo'r tartibga solingan! Quyidagi kodni barcha oshirish va kamaytirish funksiyalariga qo'shing
(#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()
        }
    }

Bu erda kod o'sish funktsiyalarini maksimal qiymatlar bilan himoya qiladi (MAX_TIP va MAX_PEOPLE). Bundan tashqari, kod kamaytirish funktsiyalarini minimal qiymatlar bilan himoya qiladi (MIN_TIP va MIN_PEOPLE).

Endi biz tugmalarni initViews funksiyasidagi tinglovchilarga bog'laymiz (№13):

private fun initViews() {
 
...
 
addTipButton.setOnClickListener(this)
        subtractTipButton.setOnClickListener(this)
 
addPeopleButton.setOnClickListener(this)
        subtractPeopleButton.setOnClickListener(this)
 
//TODO #15: Bind EditText to TextWatcher
}

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Endi siz umumiy zarar, maslahatlar va yig'ilish ishtirokchilari sonini qo'shishingiz mumkin. Xo'sh, endi eng muhimi ...

Narxlar bo'limi

Ushbu kod xarajatlarni hisoblab chiqadi (№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)
 
}

Xo'sh, bu erda kompaniyadagi odamlar sonini hisobga olish va maslahatni hisoblash imkonini beradigan funktsiya chaqiriladi (№15):

private fun incrementTip() {
 
…
 
}
 
private fun decrementTip() {
 
…
 
}
 
private fun incrementPeople() {
 
…
 
}
 
private fun decrementPeople() {
 
…
 
}

Biz dasturni ishga tushiramiz. Bu ajoyib ko'rinadi va ishlaydi. Lekin yaxshiroq bo'lishi mumkin edi.

Agar siz hisob-kitob miqdorini olib tashlashga harakat qilsangiz va keyin maslahatlar yoki do'stlar sonini ko'paytirmoqchi bo'lsangiz, dastur nol xarajatlarni tekshirish yo'qligi sababli ishlamay qoladi. Bundan tashqari, agar siz hisob-faktura miqdorini o'zgartirmoqchi bo'lsangiz, to'lovlar yangilanmaydi.

Yakuniy qadamlar

TextWatcher qo'shing (#16):

sinf MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {

Keyin biz billEditText tinglovchisini joylashtirdik (№17):

billEditText.addTextChangedListener(bu)

Bundan tashqari, TextWatcher-ni ishga tushirish uchun kod qo'shing (№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) {}

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Xo'sh, endi hamma narsa ishlaydi! Tabriklaymiz, siz Kotlinda o'zingizning "Tipping Calculator" ni yozdingiz.

Kotlinda maslahat kalkulyatorini yaratish: u qanday ishlaydi?

Skillbox tavsiya qiladi:

Manba: www.habr.com

a Izoh qo'shish