Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Nou di w ki jan yo kreye yon aplikasyon senp pou kalkile konsèy nan Kotlin. Plis jisteman, Kotlin 1.3.21, Android 4, Android Studio 3. Atik la pral enteresan, premye a tout moun, pou moun ki ap kòmanse vwayaj yo nan devlopman aplikasyon android. Li pèmèt ou konprann ki sa ak ki jan li fonksyone andedan aplikasyon an.

Kalkilatris sa a ap vin an sou la men lè ou bezwen kalkile kantite konsèy nan men yon konpayi ki deside pase tan nan yon restoran oswa kafe. Natirèlman, se pa tout moun ki toujou kite yon ti konsèy bay sèvant yo sa a se plis nan yon tradisyon Lwès, men pwosesis la nan devlope yon aplikasyon enteresan nan nenpòt ka.

Nou raple: pou tout lektè "Habr" - yon rabè nan 10 rubles lè w ap enskri nan nenpòt kou Skillbox lè l sèvi avèk kòd pwomosyon "Habr".

Skillbox rekòmande: Kou pratik "Mobile devlopè PRO.

Men sa aplikasyon an sanble nan operasyon:

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Ou antre nan pousantaj ou vle a nan kantite lajan total la, kantite patisipan reyinyon an, epi jwenn rezilta a - kantite lajan an nan konsèy ou ta dwe kite.

Pou kòmanse

Koòdone aplikasyon konplè a sanble sa a:
Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Premye aksyon - telechaje baz pwojè a. Louvri li nan Android Studio 3.0 oswa pita. Nou bati ak lanse pwojè a ak wè yon ekran blan. Tout bagay anfòm, se konsa li ta dwe ye.

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Aksyon itilizatè yo ekri nan pwojè a nan lòd kwonolojik pou fè tout bagay klè. Pou wè li, louvri View -> Zouti Windows -> TODO.

Nou etidye pwojè a epi louvri colors.xml pou evalye palèt koulè a. strings.xml gen done tèks (siyati), ak styles.xml gen plizyè modèl font.

Devlopman seksyon pri

Louvri activity_main.xml epi ajoute kòd ki anba a nan 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"/>

Koulye a, ou ka style anyè a valè oswa jwe ak koulè lè l sèvi avèk zouti material.io.

Koulye a, pwojè a sanble tankou sa a:

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?
Kòm ou ka wè, depans yo kalkile baze sou done itilizatè a antre.

Devlopman seksyon kont yo

Ajoute kòd ki anba a nan LinearLayout apre Seksyon Depans (#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>

Nou fèmen LinearLayout la apre lis TODO yo, epi ajoute nouvo kòd, mete l andedan 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"/>

Depi travay prensipal aplikasyon an se kalkile depans endividyèl pou chak patisipan nan yon rasanbleman restoran, costPersonTextView jwe wòl prensipal la.

EditText limite opinyon an nan yon liy, paramèt sa a dwe mete sou NumberDecimal inputType.

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?
Nou lanse pwojè a pou tès la epi antre nan paramèt yo pou domaj jeneral (tas kase, plak, elatriye)

Devlopman seksyon "Moun ak Konsèy".

Pou ajoute yon seleksyon volim tip, kole kòd ki anba a nan nouvo seksyon 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>

Seksyon kòd sa a nesesè pou byen kalkile kantite pwent. Valè tèks defo a se 20. ImageButtons yo bay ikon nan yon katab ki gen otorizasyon ekri.

Kopi seksyon an nèt epi ajoute sa ki annapre yo (#5):

  • ID ImageButton (soustraksyonPeopleButton, addPeopleButton)
  • TextView ids(numberOfPeopleStaticText, numberOfPeopleTextView)
  • DefaultText pou numberOfPeopleTextView (dwe 4).

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Koulye a, lè ou lanse aplikasyon an, gen yon opòtinite yo ajoute kantite lajan an fakti, bouton "Ajoute / Soustraksyon" yo travay tou, men pa gen anyen k ap pase ankò.

Ajoute View

Louvri MainActivity.kt epi ajoute sa a nan fonksyon 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
 
}

Fini bouton yo

Pou ajoute sipò pou klike sou bouton, nou aplike View.OnClickListener nan nivo klas la (#7):

klas MainActivity: AppCompatActivity(), View.OnClickListener {

Li pa pral posib pou konpile pwojè a kounye a ou bezwen fè kèk etap plis (#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()
        }
    }

An tèm de bouton ak switch, Kotlin òganize tout bagay trè fre! Ajoute kòd ki anba a nan tout fonksyon enkreman ak diminye
(#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()
        }
    }

Isit la kòd la pwoteje fonksyon enkreman yo ak valè maksimòm (MAX_TIP & MAX_PEOPLE). Anplis de sa, kòd la pwoteje fonksyon diminye ak valè minimòm (MIN_TIP & MIN_PEOPLE).

Koulye a, nou asosye bouton yo ak koute nan fonksyon initViews (#13):

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

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Ou kapab kounye a ajoute total domaj, konsèy, ak kantite patisipan reyinyon yo. Oke, kounye a bagay ki pi enpòtan ...

Seksyon kalkil pri

Kòd sa a kalkile depans (#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)
 
}

Oke, isit la yo rele yon fonksyon ki fè li posib yo pran an kont kantite moun ki nan konpayi an ak kalkile konsèy (#15):

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

Ann lanse aplikasyon an. Li sanble ak travay gwo. Men, li ta ka pi bon.

Si w eseye retire kantite lajan an epi ogmante kantite konsèy oswa zanmi, aplikasyon an ap fè aksidan paske pa gen okenn chèk ankò pou valè pri zewo a. Anplis, si w eseye chanje kantite bòdwo a, chaj yo p ap mete ajou.

Etap final yo

Ajoute TextWatcher (#16):

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

Apre sa, nou entegre moun k ap koute billEditText (#17):

billEditText.addTextChangedListener(sa)

Anplis de sa, nou ajoute kòd pou egzekite 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) {}

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Oke, kounye a absoliman tout bagay ap travay! Felisitasyon, ou te ekri pwòp ou a "Tip Calculator" nan Kotlin.

Bati yon kalkilatris tip nan Kotlin: ki jan li fonksyone?

Skillbox rekòmande:

Sous: www.habr.com

Add nouvo kòmantè