{"id":31843,"date":"2019-10-31T21:43:27","date_gmt":"2019-10-31T18:43:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet\/"},"modified":"2019-10-31T21:43:27","modified_gmt":"2019-10-31T18:43:27","slug":"sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet","title":{"rendered":"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/faaae0beaf023f1c11bb9102312fe429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nR\u00e4\u00e4gime, kuidas luua lihtne rakendus, et arvutada jootraha Kotlinis. T\u00e4psemalt Kotlin 1.3.21, Android 4, Android Studio 3. Artikkel on huvitav eelk\u00f5ige neile, kes alustavad oma teekonda Android-rakenduste arenduses. See aitab m\u00f5ista, kuidas ja mis rakenduses toimib. <\/p>\n<p>Selline kalkulaator on kasulik, kui on vaja arvutada jootraha summa nh\u00f3m, kes otsustas aega veeta restoranis v\u00f5i kohvikus. Muidugi ei j\u00e4ta k\u00f5ik ja alati teenindajatele jootraha, see on rohkem l\u00e4\u00e4ne traditsioon, kuid sellise rakenduse arendamise protsess on igal juhul huvitav. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Tuletame meelde:<\/b> <i>k\u00f5igile \u00abHabr\u00bb lugejatele \u2013 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi \u00abHabr\u00bb.<\/i><\/p>\n<p><b>Skillbox soovitab:<\/b> Praktiline kursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/agima\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=AGIMA&amp;utm_content=articles&amp;utm_term=kotlintips\">Mobiiliarendaja PRO<\/a><\/noindex>.\n<\/p><\/blockquote>\n<p>\nNii n\u00e4eb rakendus v\u00e4lja t\u00f6\u00f6protsessis:<\/p>\n<p><img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/fa375744a4ca5d07667ec494db38648b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSisestate soovitud protsendi kogusummast, kohtumiste arvu ja saate tulemuse - jootraha summa, mille peaksite j\u00e4tma.<\/p>\n<h3>Alustame<\/h3>\n<p>\nRakenduse t\u00e4isliides n\u00e4eb v\u00e4lja j\u00e4rgmine:<br \/>\n<img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/e95058f09c4a6c151b6c5500ae549c0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/ac31c73ade24640078c76d71700de0b4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nEsimene tegevus - <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lawreyios\/tipcalculator\/tree\/starter_project\">projekti aluse laadimine<\/a><\/noindex>. Avame selle Android Studio 3.0 v\u00f5i uuema versiooniga. Ehitage ja k\u00e4ivitage projekt ning n\u00e4ete valget ekraani. K\u00f5ik on korras, see on nii, nagu peab.<\/p>\n<p><img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/f4e3361ddc45d56794cc5c7c36d8b206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/7828c10dcb3936eb095f5110094ea8bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nKasutaja toimingud on projekti sarnases j\u00e4rjestuses, et k\u00f5ik oleks arusaadav. Selle vaatamiseks avame View -&gt; Tool Windows -&gt; TODO.<\/p>\n<p>Uurime projekti ja avame colors.xml, et hinnata v\u00e4rvipaletti. Tekstid on salvestatud strings.xml ja styles.xmls on mitu fondimalli.<\/p>\n<h3>Kulude jaotuse arendamine<\/h3>\n<p>\nAvame activity_main.xml ja lisame allpool oleva koodi LinearLayout'i (#1):<\/p>\n<pre><code class=\"kotlin\">&lt;TextView\n    android_id=\"@+id\/expensePerPersonTextView\"\n    android_layout_width=\"match_parent\"\n    android_layout_height=\"wrap_content\"\n    android_paddingTop=\"30dp\"\n    style=\"@style\/h1Bold\"\n    android_textColor=\"@color\/colorAccent\"\n    android_text=\"0\"\/&gt;\n \n&lt;TextView\n    android_layout_width=\"match_parent\"\n    android_layout_height=\"wrap_content\"\n    android_paddingBottom=\"25dp\"\n    style=\"@style\/h2\"\n    android_textColor=\"@color\/colorAccent\"\n    android_text=\"@string\/perPersonStaticText\"\/&gt;<\/code><\/pre>\n<p>\nN\u00fc\u00fcd saab seadistada stiili kausta values v\u00f5i m\u00e4ngida v\u00e4rvidega, kasutades <noindex><a rel=\"nofollow\" href=\"https:\/\/material.io\/tools\/color\/#!\/?view.left=0&amp;view.right=0&amp;primary.color=37474F\">materjalide t\u00f6\u00f6riista<\/a><\/noindex>.<\/p>\n<p>Praegu n\u00e4eb projekt v\u00e4lja nii:<\/p>\n<p><img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/ab47023cafd97fdbd171a9d9a1c35dd5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i> Nagu n\u00e4ete, tehakse kulude arvutust vastavalt kasutaja sisestatud andmetele. <\/i><\/p>\n<h3>Arve jaotuse arendamine<\/h3>\n<p>\nLisame allpool oleva koodi LinearLayout'i p\u00e4rast Expense Section'i (#2):<\/p>\n<pre><code class=\"kotlin\">&lt;LinearLayout\n    android_layout_width=\"match_parent\"\n    android_layout_height=\"match_parent\"\n    android_orientation=\"vertical\"\n    android_background=\"@color\/colorAccent\"&gt;\n \n&lt;! \u2014 TODO #3: Build Bill Section \u2192\n \n\u2026 \n&lt;\\\/LinearLayout&gt;<\/code><\/pre>\n<p>\nSulgeb LinearLayout p\u00e4rast TODOde loetelu ja lisame seej\u00e4rel uue koodi, paigutades selle LinearLayout'i sisse (#3):<\/p>\n<pre><code class=\"kotlin\"><\/code><\/pre>\n<p>\nKuna rakenduse peamine eesm\u00e4rk on iga\u00fche kulude individuaalne arvutamine restoranis, m\u00e4ngib costPerPersonTextView suurimat rolli. <\/p>\n<p>EditText piirab andmete sisestamist \u00fche reaga, sellel parameetril peab olema NumberDecimal inputType v\u00e4\u00e4rtus.<\/p>\n<p><img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/7dc4e90d8188a08933e7a92b119472ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i> K\u00e4ivitame projekti testimiseks ja sisestame kogukahjude parameetrid (katkised tassid, taldrikud jne).<\/i><\/p>\n<h3>Jaotise \u201eInimesed jaTips\u201c arendamine<\/h3>\n<p>\nKuna tahame lisada valiku jootrahade koguse kohta, sisestame allpool oleva koodi uude LinearLayout'i sektsiooni (#4):<\/p>\n<pre><code class=\"kotlin\"><\/code><\/pre>\n<p>\nSee koodijupp on vajalik jootrahade summa t\u00e4pseks arvutamiseks. Vaikimisi teksti v\u00e4\u00e4rtus on 20. ImageButton'id on varustatud ikoonidega kirjeldus\u00f5igustes.<\/p>\n<p>Kopeerime jaotise t\u00e4ielikult ja lisame j\u00e4rgmise (#5):<\/p>\n<ul>\n<li> ImageButton'i ids (subtractPeopleButton, addPeopleButton)<\/li>\n<li> TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)<\/li>\n<li> DefaultText numberOfPeopleTextView jaoks (peab olema 4).<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/df99acfb33c3d27126db807b805c9c87.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nN\u00fc\u00fcd rakenduse k\u00e4ivitamisel on v\u00f5imalus lisada arve summa, samuti t\u00f6\u00f6tavad nupud 'Lisa\/V\u00f5ta \u00e4ra', kuid praegu ei toimu midagi.<\/p>\n<h3>Lisame Views<\/h3>\n<p>\nAvame MainActivity.kt ja lisame j\u00e4rgmise initViews funktsiooni (#6):<\/p>\n<pre><code class=\"kotlin\">private fun initViews() {\n        expensePerPersonTextView = findViewById(R.id.expensePerPersonTextView)\n        billEditText = findViewById(R.id.billEditText)\n \naddTipButton = findViewById(R.id.addTipButton)\n        tipTextView = findViewById(R.id.tipTextView)\n        subtractTipButton = findViewById(R.id.subtractTipButton)\n \naddPeopleButton = findViewById(R.id.addPeopleButton)\n        numberOfPeopleTextView = findViewById(R.id.numberOfPeopleTextView)\n        subtractPeopleButton = findViewById(R.id.subtractPeopleButton)\n \n\/\/TODO #8: Bind Buttons to Listener\n \n\/\/TODO #16: Bind EditText to TextWatcher\n \n}<\/code><\/pre>\n<p><\/p>\n<h3>Viimeistelemme painikkeet<\/h3>\n<p>\nLis\u00e4t\u00e4\u00e4n painikkeiden klikkaustuki k\u00e4ytt\u00e4m\u00e4ll\u00e4 View.OnClickListener-luokkaa (#7):<\/p>\n<p>class MainActivity: AppCompatActivity(), View.OnClickListener {<\/p>\n<p>Projektia ei voi k\u00e4\u00e4nt\u00e4\u00e4 nyt, on suoritettava viel\u00e4 muutama toimenpide (#8):<\/p>\n<pre><code class=\"kotlin\">override fun onClick(v: View?) {\n        when (v?.id) {\n            R.id.addTipButton -&gt; incrementTip()\n            R.id.subtractTipButton -&gt; decrementTip()\n            R.id.addPeopleButton -&gt; incrementPeople()\n            R.id.subtractPeopleButton -&gt; decrementPeople()\n        }\n    }<\/code><\/pre>\n<p>\nKotlinissa painikkeiden ja kytkimien hallinta on todella hienoa! Lis\u00e4\u00e4 alla oleva koodi kaikkiin increment- ja decrement-funktioihin<br \/>\n (#9\u2013#12):<\/p>\n<pre><code class=\"kotlin\">private fun incrementTip() {\n        if (tipPercent != MAX_TIP) {\n            tipPercent += TIP_INCREMENT_PERCENT\n            tipTextView.text = String.format(\"%d%%\", tipPercent)\n        }\n    }\n \nprivate fun decrementTip() {\n        if (tipPercent != MIN_TIP) {\n            tipPercent -= TIP_INCREMENT_PERCENT\n            tipTextView.text = String.format(\"%d%%\", tipPercent)\n        }\n    }\n \nprivate fun incrementPeople() {\n        if (numberOfPeople != MAX_PEOPLE) {\n            numberOfPeople += PEOPLE_INCREMENT_VALUE\n            numberOfPeopleTextView.text = numberOfPeople.toString()\n        }\n    }\n \nprivate fun decrementPeople() {\n        if (numberOfPeople != MIN_PEOPLE) {\n            numberOfPeople -= PEOPLE_INCREMENT_VALUE\n            numberOfPeopleTextView.text = numberOfPeople.toString()\n        }\n    }<\/code><\/pre>\n<p>\nT\u00e4ss\u00e4 koodi suojaa increment-toiminnot maksimiarvoilta (MAX_TIP &amp; MAX_PEOPLE). Lis\u00e4ksi, koodi suojaa decrement-toiminnot minimim\u00e4\u00e4rilt\u00e4 (MIN_TIP &amp; MIN_PEOPLE).<\/p>\n<p>Nyt yhdist\u00e4mme painikkeet kuuntelijoihin initViews-funktiossa (#13):<\/p>\n<pre><code class=\"kotlin\">private fun initViews() {\n \n...\n \naddTipButton.setOnClickListener(this)\n        subtractTipButton.setOnClickListener(this)\n \naddPeopleButton.setOnClickListener(this)\n        subtractPeopleButton.setOnClickListener(this)\n \n\/\/TODO #15: Bind EditText to TextWatcher\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/73e7477d4b02548aad7c2112c6be5d80.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNyt voimme laskea yhteiset kulut, tipit ja osallistujam\u00e4\u00e4r\u00e4t. Ja nyt kaikkein t\u00e4rkein\u2026<\/p>\n<h3>Kulujen laskenta jaottelu<\/h3>\n<p>T\u00e4m\u00e4 koodi laskee kulut (#14):<\/p>\n<pre><code class=\"kotlin\">private fun calculateExpense() {\n \nval totalBill = billEditText.text.toString().toDouble()\n \nval totalExpense = ((HUNDRED_PERCENT + tipPercent) \/ HUNDRED_PERCENT) * totalBill\n        val individualExpense = totalExpense \/ numberOfPeople\n \nexpensePerPersonTextView.text = String.format(\"$%.2f\", individualExpense)\n \n}<\/code><\/pre>\n<p>\nJa t\u00e4ss\u00e4 kutsutaan funktiota, joka ottaa huomioon ryhm\u00e4n koon ja laskee tipit (#15):<\/p>\n<pre><code class=\"kotlin\">private fun incrementTip() {\n \n\u2026\n \n}\n \nprivate fun decrementTip() {\n \n\u2026\n \n}\n \nprivate fun incrementPeople() {\n \n\u2026\n \n}\n \nprivate fun decrementPeople() {\n \n\u2026\n \n}<\/code><\/pre>\n<p>\nK\u00e4ivitame rakenduse. See n\u00e4eb v\u00e4lja ja t\u00f6\u00f6tab suurep\u00e4raselt. Kuid v\u00f5iks veel parem olla.<\/p>\n<p>Kui proovite kustutada arve summat ja seej\u00e4rel suurendada vihjete v\u00f5i s\u00f5prade arvu, siis rakendus kukub, kuna kulude nullv\u00e4\u00e4rtuse kontrollimist pole veel tehtud. Veelgi enam, kui proovite muuta arve summat, kulud ei uuene.<\/p>\n<h3>L\u00f5ppastmed<\/h3>\n<p>\nLisame TextWatcher (#16):<\/p>\n<p>class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {<\/p>\n<p>Seej\u00e4rel lisame kuulaja billEditText (#17):<\/p>\n<p>billEditText.addTextChangedListener(this)<\/p>\n<p>Pluss lisame koodi TextWatcher'i teostamiseks (#18):<\/p>\n<pre><code class=\"kotlin\">override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {\n        if (!billEditText.text.isEmpty()) {\n            calculateExpense()\n        }\n    }\noverride fun afterTextChanged(s: Editable?) {}\n\n    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/623256a43c969d8b3a434d10a357c1a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nN\u00fc\u00fcd t\u00f6\u00f6tab k\u00f5ik t\u00e4iesti h\u00e4sti! Palju \u00f5nne, olete kirjutanud oma \u00abJootraha kalkulaatori\u00bb Kotlin'is.<\/p>\n<p><img decoding=\"async\" alt=\"Tips kalkulaatori loomine Kotlinis: kuidas see t\u00f6\u00f6tab?\" src=\"\/wp-content\/uploads\/2019\/04\/5650bfecfadf3fd56785b7d6ac72ed87.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<blockquote><p><b>Skillbox soovitab:<\/b><\/p>\n<ul>\n<li>Kaks aastat praktilist kursust <noindex><a rel=\"nofollow\" href=\"https:\/\/iamwebdev.skillbox.ru\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=WEBDEVPRO&amp;utm_content=articles&amp;utm_term=kotlintips\">\u00abMa olen PRO veebiarendaja\u00bb<\/a><\/noindex>.<\/li>\n<li>Veebikursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/c-sharp\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=CSHDEV&amp;utm_content=articles&amp;utm_term=kotlintips\">\u00abC# arendaja\u00bb<\/a><\/noindex>.<\/li>\n<li>Praktiline aastakursus <noindex><a rel=\"nofollow\" href=\"https:\/\/skillbox.ru\/php\/?utm_source=skillbox.media&amp;utm_medium=habr.com&amp;utm_campaign=PHPDEV&amp;utm_content=articles&amp;utm_term=kotlintips\">\u00abPHP-arendaja 0-st PRO-ni\u00bb<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/skillbox\/blog\/448582\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0447\u0430\u0435\u0432\u044b\u0445 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Kotlin. \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u0442\u043e Kotlin 1.3.21, Android 4, Android Studio 3. \u0421\u0442\u0430\u0442\u044c\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043f\u0443\u0442\u044c \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Android-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0438 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0422\u0430\u043a\u043e\u0439 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u0447\u0430\u0435\u0432\u044b\u0445 \u0441 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23712,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-31843","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0447\u0430\u0435\u0432\u044b\u0445 \u043d\u0430 Kotlin: \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:43:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:43:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kalkulaatori jootraha loomine Kotlin'is: kuidas see t\u00f6\u00f6tab? | ProHoster","description":"R\u00e4\u00e4gime, kuidas luua lihtne.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0447\u0430\u0435\u0432\u044b\u0445 \u043d\u0430 Kotlin: \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? | ProHoster","og:description":"\u0420\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0435.","og:url":"https:\/\/prohoster.info\/et\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:43:27+00:00","article:modified_time":"2019-10-31T18:43:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31843","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 08:07:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:10:45","updated":"2026-01-21 08:07:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/31843","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=31843"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/31843\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/23712"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=31843"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=31843"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=31843"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}