Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

A sọ fun ọ bi o ṣe le ṣẹda ohun elo ti o rọrun fun iṣiro awọn imọran ni Kotlin. Ni deede diẹ sii, Kotlin 1.3.21, Android 4, Android Studio 3. Nkan naa yoo jẹ iyanilenu, akọkọ, fun awọn ti o bẹrẹ irin-ajo wọn ni idagbasoke ohun elo Android. O faye gba o lati ni oye ohun ti ati bi o ti ṣiṣẹ inu awọn ohun elo.

Ẹrọ iṣiro yii yoo wa ni ọwọ nigbati o nilo lati ṣe iṣiro iye awọn imọran lati ọdọ ile-iṣẹ ti o pinnu lati lo akoko ni ile ounjẹ tabi kafe kan. Nitoribẹẹ, kii ṣe gbogbo eniyan nigbagbogbo fi aaye kan silẹ si awọn oluduro; eyi jẹ diẹ sii ti aṣa Oorun, ṣugbọn ilana ti idagbasoke iru ohun elo jẹ iwunilori ni eyikeyi ọran.

A leti: fun gbogbo awọn oluka ti "Habr" - ẹdinwo ti 10 rubles nigbati o forukọsilẹ ni eyikeyi iṣẹ-ẹkọ Skillbox nipa lilo koodu ipolowo “Habr”.

Skillbox ṣe iṣeduro: Ilana ti o wulo “Olugbese alagbeka PRO.

Eyi ni ohun ti ohun elo naa dabi ninu iṣẹ:

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

O tẹ ipin ogorun ti o fẹ ti iye lapapọ, nọmba awọn olukopa ipade, ati gba abajade - iye ti imọran ti o yẹ ki o lọ kuro.

Berè

Ni wiwo ohun elo pipe dabi eyi:
Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

Igbese akọkọ - gbigba lati ayelujara ipilẹ ise agbese. Ṣi i ni Android Studio 3.0 tabi nigbamii. A kọ ati ṣe ifilọlẹ iṣẹ naa ati rii iboju funfun kan. Ohun gbogbo dara, iyẹn ni o yẹ ki o jẹ.

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

Awọn iṣe olumulo ni a kọ sinu iṣẹ akanṣe ni ilana akoko lati jẹ ki ohun gbogbo han. Lati wo, ṣii Wo -> Ọpa Windows -> TODO.

A ṣe iwadi iṣẹ akanṣe ati ṣiṣi awọn awọ.xml lati ṣe iṣiro paleti awọ. strings.xml ni data ọrọ ninu (awọn ibuwọlu), ati styles.xml ni ọpọlọpọ awọn awoṣe fonti ninu.

Idagbasoke apakan iye owo

Ṣii iṣẹ_main.xml ki o ṣafikun koodu ni isalẹ si 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"/>

Bayi o le ara awọn iye liana tabi mu awọn pẹlu awọn awọ lilo material.io ọpa.

Bayi ise agbese na dabi eyi:

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?
Bi o ti le rii, awọn idiyele jẹ iṣiro da lori data ti olumulo tẹ sii.

Idagbasoke ti awọn iroyin apakan

Ṣafikun koodu ti o wa ni isalẹ si LinearLayout lẹhin Apa inawo (#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>

A pa LinearLayout lẹhin atokọ ti awọn TODO, lẹhinna ṣafikun koodu tuntun, gbigbe si inu 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"/>

Niwọn igba ti iṣẹ akọkọ ti ohun elo ni lati ṣe iṣiro awọn idiyele ẹni kọọkan fun alabaṣe kọọkan ninu apejọ ounjẹ kan, iye owoPersonTextView ṣe ipa akọkọ.

ṢatunkọText ṣe opin igbewọle si laini kan, paramita yii gbọdọ wa ni ṣeto si NumberDecimal inputType.

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?
A ṣe ifilọlẹ iṣẹ akanṣe fun idanwo ati tẹ awọn ayeraye fun ibajẹ gbogbogbo (awọn agolo fifọ, awọn awo, ati bẹbẹ lọ)

Idagbasoke ti apakan "Awọn eniyan ati Awọn imọran".

Lati ṣafikun yiyan iwọn didun imọran, lẹẹmọ koodu ni isalẹ sinu apakan LinearLayout tuntun (#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>

Yi apakan ti koodu jẹ pataki lati ṣe iṣiro deede iye sample. Iwọn ọrọ aiyipada jẹ 20. Awọn bọtini Aworan ti pese pẹlu awọn aami ninu folda pẹlu awọn igbanilaaye kikọ.

Daakọ apakan naa patapata ki o ṣafikun atẹle naa (#5):

  • Awọn ids Bọtini Aworan (iyokuro Awọn bọtini Bọtini, addPeopleButton)
  • Awọn ids TextView(nọmbaOfEniyanStaticText, nombaOfEniyanTextView)
  • Ọrọ aiyipada fun nọmbaOfPeopleTextView (gbọdọ jẹ 4).

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

Bayi, nigba ti o ba ṣe ifilọlẹ ohun elo naa, aye wa lati ṣafikun iye risiti, awọn bọtini “Fikun-un / Iyokuro” tun ṣiṣẹ, ṣugbọn ko si ohun ti o ṣẹlẹ sibẹsibẹ.

Fifi Awọn iwo

Ṣi MainActivity.kt ki o ṣafikun eyi si iṣẹ 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
 
}

Ipari awọn bọtini

Lati ṣafikun atilẹyin fun awọn titẹ bọtini, a ṣe View.OnClickListener ni ipele kilasi (#7):

iṣẹ akọkọ kilasi: AppCompatActivity (), View.OnClickListener {

Kii yoo ṣee ṣe lati ṣajọ iṣẹ akanṣe ni bayi; o nilo lati ṣe awọn igbesẹ diẹ sii (#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()
        }
    }

Ni awọn ofin ti awọn bọtini ati awọn yipada, Kotlin ṣeto ohun gbogbo dara pupọ! Ṣafikun koodu ti o wa ni isalẹ si gbogbo awọn iṣẹ afikun ati idinku
(#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()
        }
    }

Nibi koodu ṣe aabo awọn iṣẹ afikun pẹlu awọn iye ti o pọju (MAX_TIP & MAX_PEOPLE). Ni afikun, koodu ṣe aabo awọn iṣẹ idinku pẹlu awọn iye to kere julọ (MIN_TIP & MIN_PEOPLE).

Bayi a ṣepọ awọn bọtini pẹlu awọn olutẹtisi ni iṣẹ initViews (#13):

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

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

O le ṣafikun awọn bibajẹ lapapọ, awọn imọran, ati nọmba awọn olukopa ipade. O dara, bayi ohun pataki julọ ...

Abala iṣiro iye owo

Koodu yii ṣe iṣiro awọn idiyele (#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)
 
}

O dara, nibi ni a pe iṣẹ kan ti o jẹ ki o ṣee ṣe lati ṣe akiyesi nọmba awọn eniyan ni ile-iṣẹ ati ṣe iṣiro awọn imọran (#15):

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

Jẹ ká lọlẹ awọn ohun elo. O wulẹ ati ki o ṣiṣẹ nla. Ṣugbọn o le dara julọ.

Ti o ba gbiyanju lati yọ iye owo naa kuro lẹhinna mu nọmba awọn imọran tabi awọn ọrẹ pọ si, ohun elo naa yoo kọlu nitori ko si ayẹwo sibẹsibẹ fun iye idiyele odo. Pẹlupẹlu, ti o ba gbiyanju lati yi iye owo naa pada, awọn idiyele naa kii yoo ni imudojuiwọn.

Awọn igbesẹ ipari

Ṣafikun TextWatcher (#16):

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

Lẹhinna a fi sabe olutẹtisi BillEditText (#17):

billEditText.addTextChangedListener(eyi)

Pẹlupẹlu a ṣafikun koodu lati ṣiṣẹ 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) {}

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

Daradara, bayi Egba ohun gbogbo ṣiṣẹ! Oriire, o ti kọ “Iṣiro Italologo” tirẹ ni Kotlin.

Ṣiṣẹda iṣiro imọran ni Kotlin: bawo ni o ṣe n ṣiṣẹ?

Skillbox ṣe iṣeduro:

orisun: www.habr.com

Fi ọrọìwòye kun