
Kotlin dilində məsləhətləri hesablamaq üçün sadə bir tətbiq yaratmağı izah edirik. Dəqiq desək, Kotlin 1.3.21, Android 4, Android Studio 3. Bu məqalə, Android tətbiqinin hazırlanmasına yeni başlayanlar üçün xüsusilə maraqlı olacaq. Bu, tətbiqin daxilində nələrin və necə işlədiyini anlamağa imkan verir.
Belə bir kalkulyator, restoran və ya kafedə vaxt keçirmək üçün qərar verən bir şirkət üçün məsləhətlərin ümumi məbləğini hesablamaq lazım olanda faydalı olacaq. Əlbəttə ki, hamı hər zaman ofisiantlara məsləhət qoya bilmir, bu daha çox qərb ənənəsidir, amma belə bir tətbiqin hazırlanma prosesi hər halda maraqlıdır.
Xatırladırıq: bütün «Habr» oxucularına — «Habr» promo kodu ilə Skillbox-dakı hər hansı kursa qeydiyyat zamanı 10 000 rubl endirim.
Skillbox tövsiyə edir: Praktik kurs .
Tətbiqin işlək prosesində görünüşü belədir:

Ümumi məbləğdən istədiyiniz faizi, görüş iştirakçılarının sayını daxil edirsiniz və nəticəni alırsınız — qoyulması lazım olan məsləhətlərin məbləği.
Başlayırıq
Tətbiqin tam interfeysi aşağıdakı kimidir:


İlk addım — . Onu Android Studio 3.0 və ya daha yeni versiyada açın. Layihəni qurub işə saldığınızda ağ ekran görəcəksiniz. Hər şey normaldır, belə olmalıdır.


İstifadəçi hərəkətləri layihədə xronoloji ardıcıllıqla yazılıb ki, hər şey aydın olsun. Bunu görmək üçün View -> Tool Windows -> TODO menyusunu açın.
Layihəni öyrənib, rəng palitrasını qiymətləndirmək üçün colors.xml faylını açırıq. strings.xml faylında mətndə olan məlumatlar (etiketlər), styles.xml faylında isə bir neçə şrift şablonu var.
Xərclər bölməsinin hazırlanması
activity_main.xml faylını açırıq və aşağıda verilən kodu LinearLayout-a (#1) əlavə edirik:
<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"/>İndi values direktoriyasının stilini tənzimləmək və ya rənglərlə oynamaq olar, istifadə edərək .
İndi layihə belə görünür:

Gördüyünüz kimi, xərclərin hesablanması istifadəçinin daxil etdiyi məlumatlara əsaslanır.
Hesablar bölməsinin inkişafı
Xərclər Bölməsindən sonra LinearLayout-a aşağıda verilən kodu əlavə edirik (#2):
<LinearLayout
android_layout_width="match_parent"
android_layout_height="match_parent"
android_orientation="vertical"
android_background="@color/colorAccent">
<! — TODO #3: Hesab Bölməsini qurun →
…
</LinearLayout>TODO-ların siyahısından sonra LinearLayout-u bağlayırıq və yeni kodu əlavə edərək onu LinearLayout-a (#3) daxil edirik:
Proqramın əsas vəzifəsi — restoranlardakı iştirakçılar üçün fərdi xərcləri hesablamadır. Bu səbəbdən costPerPersonTextView-ın rolu çox önəmlidir.
EditText məlumat girişini tək sətirlə məhdudlaşdırır, bu parametrin NumberDecimal inputType dəyəri olmalıdır.

Proqramı test üçün işə salırıq və ümumi ziyan parametrlərini daxil edirik (sındırılan fincanlar, boşqablar və s.).
«İnsanlar və bahşişlər» bölməsinin hazırlanması.
Bahşiş həcmi seçimi əlavə etmək üçün aşağıda yerləşən kodu yeni LinearLayout bölməsinə (#4) daxil edirik:
Bu kod hissəsi bahşiş məbləğinin düzgün hesablanması üçün zəruridir. Defolt mətn dəyəri — 20. ImageButtons ikonalarla təmin edilir və yazma icazəsi olan qovluqdadır.
Bölməyi tamamilə kopyalayırıq və aşağıdakını əlavə edirik (#5):
- ImageButton identifikatorları (subtractPeopleButton, addPeopleButton)
- TextView identifikatorları (numberOfPeopleStaticText, numberOfPeopleTextView)
- numberOfPeopleTextView üçün DefaultText (4 olmalıdır).

İndi proqram işə salındıqda hesab məbləğini əlavə etmək imkanı var, həmçinin «Əlavə et/Və ya çıxar» düymələri işləyir, amma indiyə qədər heç bir şey baş vermir.
Views əlavə edirik.
MainActivity.kt açırıq və initViews funksiyasına bunu əlavə edirik (#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
}Düymələri tamamlayırıq.
Düymələrin kliklənmə dəstəyi əlavə etmək üçün View.OnClickListener-i sinif səviyyəsində tətbiq edirik (#7):
class MainActivity: AppCompatActivity(), View.OnClickListener {
İndi layihəni tərtib etmək mümkün deyil, bir neçə əlavə addım atılmalıdır (#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-də düymələr və açarlar çox gözəl təşkil edilib! Aşağıda yerləşdirilən kodu increment və decrement funksiyalarına əlavə edirik
(#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()
}
}Burada kod maksimum dəyərlərə (MAX_TIP & MAX_PEOPLE) sahib artırma funksiyalarını qoruyur. Bundan əlavə, kod minimum dəyərlərlə (MIN_TIP & MIN_PEOPLE) olan azalma funksiyalarını da qoruyur.
İndi düymələri dinləyicilərlə bağlayırıq initViews funksiyasında (#13):
private fun initViews() {
...
addTipButton.setOnClickListener(this)
subtractTipButton.setOnClickListener(this)
addPeopleButton.setOnClickListener(this)
subtractPeopleButton.setOnClickListener(this)
//TODO #15: EditText-i TextWatcher-a bağla
} 
İndi ümumi ziyan, çörəyə və iştirakçıların sayını əlavə etmək mümkündür. Və indi ən vacibi...
Xərcləri hesablama bölməsi
Bu kod xərcləri hesablamaq üçün (#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)
}Burada isə insan sayını nəzərə alan və çörəkləri hesablamağa imkan verən funksiya çağırılır (#15):
private fun incrementTip() {
…
}
private fun decrementTip() {
…
}
private fun incrementPeople() {
…
}
private fun decrementPeople() {
…
}Proqramı işə salırıq. Görünüşü və işi mükəmməldir. Amma daha da yaxşı ola bilər.
Əgər siz hesab məbləğini silməyə çalışsanız və sonra ipucu və ya dostların sayını artırmağa çalışsanız, proqram çökəcək, çünki xərclərin sıfır dəyərini yoxlamaq hələ yoxdur. Bundan əlavə, əgər siz hesab məbləğini dəyişməyə çalışsanız, xərclər yenilənməyəcək.
Son addımlar
TextWatcher əlavə edirik (#16):
class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {
Sonra billEditText-də dinləyicini yerləşdiririk (#17):
billEditText.addTextChangedListener(this)
Bundan əlavə, TextWatcher-in icrasını təmin edən kodu əlavə edirik (#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) {} 
İndi isə hər şey mükəmməl işləyir! Təbriiklər, siz öz "Çay hesablayıcınız"-ı Kotlin-də yazmısınız.

Skillbox tövsiyə edir:
- İki illik praktiki kurs .
- Onlayn-kurs .
- Praktik illik kurs .
Mənbə: habr.com
