Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?

Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?

Мо ба шумо нишон медиҳем, ки чӣ гуна як барномаи оддии ҳисобкунии маслиҳатро дар Котлин созед. Аниқтараш, Kotlin 1.3.21, Android 4, Android Studio 3. Мақола, пеш аз ҳама, барои онҳое, ки саёҳати худро дар таҳияи замимаҳои Android оғоз мекунанд, ҷолиб хоҳад буд. Он ба шумо имкон медиҳад фаҳмед, ки дар дохили барнома чӣ ва чӣ тавр кор мекунад.

Чунин ҳисобкунак вақте муфид аст, ки ба шумо лозим аст, ки миқдори маслиҳатҳоро аз ширкате ҳисоб кунед, ки тасмим гирифтааст дар тарабхона ё қаҳвахона вақт гузаронад. Албатта, на ҳама ва на ҳамеша чойро барои пешхизматҳо мегузоранд, ин бештар анъанаи ғарбист, аммо раванди таҳияи чунин барнома дар ҳар сурат ҷолиб аст.

Мо ба шумо хотиррасон мекунем: барои ҳамаи хонандагони "Habr" - тахфифи 10 000 рубл ҳангоми номнавис шудан ба курсҳои Skillbox бо истифода аз рамзи таблиғотии "Habr".

Skillbox тавсия медиҳад: Курси амалӣ "Developer Mobile PRO.

Ин аст он чизе ки барнома ҳангоми кор карданаш ба назар мерасад:

Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?

Шумо фоизи дилхоҳи маблағи умумӣ, шумораи иштирокчиёни вохӯриро ворид мекунед ва натиҷа мегиред - миқдори маслиҳатҳое, ки бояд гузошта шаванд.

Оғоз кардан

Интерфейси пурраи барнома чунин менамояд:
Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?

Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?

Амали аввал - зеркашии заминаи лоиҳа. Онро дар Android Studio 3.0 ё навтар кушоед. Мо лоиҳаро месозем ва иҷро мекунем ва экрани сафедро мебинем. Ҳама чиз хуб аст, тавре ки бояд бошад.

Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?

Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?

Амалҳои корбар дар лоиҳа бо тартиби хронологӣ навишта шудаанд, то ҳама чиз равшан бошад. Барои дидани он, Намоиш -> Воситаи Windows -> TODO -ро кушоед.

Мо лоиҳаро меомӯзем ва color.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"/>

Акнун шумо метавонед феҳристи арзишҳоро услуб кунед ё бо истифода аз рангҳо бозӣ кунед асбоби material.io.

Ҳоло лоиҳа чунин менамояд:

Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?
Тавре ки шумо мебинед, ҳисобкунии хароҷот ба маълумоти воридкардаи корбар асос ёфтааст.

Таҳияи бахши ҳисоб

Рамзи зерро ба 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>

Пас аз рӯйхати 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 муқаррар карда шавад.

Сохтани ҳисобкунаки маслиҳат дар Котлин: он чӣ гуна кор мекунад?
Мо лоиҳаро барои санҷиш оғоз мекунем ва параметрҳои зарари умумиро (косаҳои шикаста, табақҳо ва ғайра) ворид мекунем.

Таҳияи бахши «Одамон ва маслиҳатҳо».

Барои илова кардани интихобкунандаи маблағи маслиҳат, рамзи зерро ба қисмати нави 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):

  • ID-ҳои ImageButton (subtractPeopleButton, addPeopleButton)
  • ID-ҳои TextView (numberOfPeopleStaticText, numberOfPeopleTextView)
  • DefaultText барои 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()
        }
    }

Дар робита ба тугмаҳо ва коммутаторҳо, Котлин ҳама чизро хеле хуб ташкил кардааст! Рамзи зерро ба ҳама функсияҳои афзоиш ва коҳиш илова кунед
(№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):

class 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 тавсия медиҳад:

Манбаъ: will.com

Илова Эзоҳ