{"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\/ro\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet","title":{"rendered":"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/faaae0beaf023f1c11bb9102312fe429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n\u00ce\u021bi prezent\u0103m cum s\u0103 creezi o aplica\u021bie simpl\u0103 pentru calcularea bac\u0219i\u0219ului \u00een limbajul Kotlin. Mai exact, folosind Kotlin 1.3.21, Android 4, Android Studio 3. Articolul va fi interesant, \u00een primul r\u00e2nd, pentru cei care \u00eencep drumul \u00een dezvoltarea aplica\u021biilor Android. Aceasta permite \u00een\u021belegerea modului \u00een care func\u021bioneaz\u0103 aplica\u021bia. <\/p>\n<p>Un astfel de calculator este util atunci c\u00e2nd trebuie s\u0103 calculezi suma bac\u0219i\u0219ului pentru o companie care a decis s\u0103 petreac\u0103 timp \u00eentr-un restaurant sau cafenea. Desigur, nu toat\u0103 lumea \u0219i nu \u00eentotdeauna las\u0103 bac\u0219i\u0219 pentru chelneri, aceasta fiind mai mult o tradi\u021bie occidental\u0103, dar procesul de dezvoltare a unei astfel de aplica\u021bii este interesant \u00een orice caz. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>V\u0103 reamintim:<\/b> <i>pentru to\u021bi cititorii \u201eHabr\u201d \u2014 reducere de 10.000 de ruble la \u00eenscrierea la orice curs Skillbox cu codul de promovare \u201eHabr\u201d.<\/i><\/p>\n<p><b>Skillbox recomand\u0103:<\/b> Curs practic <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\">\u201eDezvoltator Mobil PRO<\/a><\/noindex>.\n<\/p><\/blockquote>\n<p>\nIat\u0103 cum arat\u0103 aplica\u021bia \u00een timpul func\u021bion\u0103rii:<\/p>\n<p><img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/fa375744a4ca5d07667ec494db38648b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nIntroduci procentul dorit din suma total\u0103, num\u0103rul de participan\u021bi la \u00eent\u00e2lnire \u0219i prime\u0219ti rezultatul \u2014 suma bac\u0219i\u0219ului care ar trebui l\u0103sat\u0103.<\/p>\n<h3>\u00cencepem<\/h3>\n<p>\nInterfa\u021ba complet\u0103 a aplica\u021biei arat\u0103 astfel:<br \/>\n<img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/e95058f09c4a6c151b6c5500ae549c0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/ac31c73ade24640078c76d71700de0b4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nPrima ac\u021biune \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lawreyios\/tipcalculator\/tree\/starter_project\">\u00eenc\u0103rcarea fundamentului proiectului<\/a><\/noindex>. O deschidem \u00een Android Studio 3.0 sau o versiune ulterioar\u0103. Construim \u0219i rul\u0103m proiectul \u0219i vedem un ecran alb. Totul este \u00een regul\u0103, a\u0219a trebuie s\u0103 fie.<\/p>\n<p><img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/f4e3361ddc45d56794cc5c7c36d8b206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/7828c10dcb3936eb095f5110094ea8bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAc\u021biunile utilizatorului sunt scrise \u00een proiect \u00eentr-o ordine cronologic\u0103, astfel \u00eenc\u00e2t totul s\u0103 fie clar. Pentru a le vizualiza, deschide\u021bi View -&gt; Tool Windows -&gt; TODO.<\/p>\n<p>Examin\u0103m proiectul \u0219i deschidem colors.xml pentru a evalua paleta de culori. \u00cen strings.xml sunt plasate datele textuale (etichete), iar \u00een styles.xml exist\u0103 c\u00e2teva \u0219abloane de fonturi.<\/p>\n<h3>Dezvoltarea sec\u021biunii de cheltuieli<\/h3>\n<p>\nDeschidem activity_main.xml \u0219i ad\u0103ug\u0103m codul de mai jos \u00een LinearLayout (#1):<\/p>\n<pre><code class=\"kotlin\"><\/code><\/pre>\n<p>\nAcum po\u021bi ajusta stilul din directorul values sau po\u021bi experimenta cu culorile, folosind <noindex><a rel=\"nofollow\" href=\"https:\/\/material.io\/tools\/color\/#!\/?view.left=0&amp;view.right=0&amp;primary.color=37474F\">instrumentul material.io<\/a><\/noindex>.<\/p>\n<p>Acum proiectul arat\u0103 astfel:<\/p>\n<p><img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/ab47023cafd97fdbd171a9d9a1c35dd5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i> A\u0219a cum vezi, calculul cheltuielilor se face pe baza datelor introduse de utilizator. <\/i><\/p>\n<h3>Dezvoltarea sec\u021biunii de facturi<\/h3>\n<p>\nAd\u0103ug\u0103m codul de mai jos \u00een LinearLayout dup\u0103 Sec\u021biunea Cheltuieli (#2):<\/p>\n<pre><code class=\"kotlin\">&lt;! \u2014 TODO #3: Construie\u0219te Sec\u021biunea Factur\u0103 \u2192\n \n\u2026<\/code><\/pre>\n<p>\n\u00cenchidem LinearLayout dup\u0103 lista de TODO-uri, apoi ad\u0103ug\u0103m noul cod, plas\u00e2ndu-l \u00een interiorul LinearLayout (#3):<\/p>\n<pre><code class=\"kotlin\"><\/code><\/pre>\n<p>\nDeoarece sarcina principal\u0103 a aplica\u021biei este calcularea cheltuielilor individuale pentru fiecare dintre participan\u021bii la \u00eent\u00e2lnirile din restaurant, costPerPersonTextView are o importan\u021b\u0103 deosebit\u0103. <\/p>\n<p>EditText limiteaz\u0103 introducerea de date la o singur\u0103 linie, iar acest parametru trebuie s\u0103 aib\u0103 valoarea NumberDecimal inputType.<\/p>\n<p><img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/7dc4e90d8188a08933e7a92b119472ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i> Lans\u0103m proiectul pentru testare \u0219i introducem parametrii daunei totale (farfurii, ce\u0219ti etc. sparte)<\/i><\/p>\n<h3>Dezvoltarea sec\u021biunii \u201eOameni \u0219i bac\u0219i\u0219uri\u201d<\/h3>\n<p>\nPentru a ad\u0103uga op\u021biunea de alegere a sumei pentru bac\u0219i\u0219, inser\u0103m codul de mai jos \u00eentr-o nou\u0103 sec\u021biune LinearLayout (#4):<\/p>\n<pre><code class=\"kotlin\"><\/code><\/pre>\n<p>\nAceast\u0103 por\u021biune de cod este necesar\u0103 pentru a calcula cu exactitate suma bac\u0219i\u0219ului. Valoarea implicit\u0103 a textului este 20. ImageButtons sunt echipate cu pictograme \u00een folderul cu permisiuni de scriere.<\/p>\n<p>Copiem complet sec\u021biunea \u0219i ad\u0103ug\u0103m urm\u0103toarele (#5):<\/p>\n<ul>\n<li> ImageButton ids (subtractPeopleButton, addPeopleButton)<\/li>\n<li> TextView ids (numberOfPeopleStaticText, numberOfPeopleTextView)<\/li>\n<li> DefaultText pentru numberOfPeopleTextView (trebuie s\u0103 fie 4).<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/df99acfb33c3d27126db807b805c9c87.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAcum, la lansarea aplica\u021biei, exist\u0103 op\u021biunea de a ad\u0103uga suma facturii, iar butoanele \u201eAd\u0103uga\u021bi\/Scade\u021bi\u201d func\u021bioneaz\u0103, dar momentan nu se \u00eent\u00e2mpl\u0103 nimic.<\/p>\n<h3>Ad\u0103ug\u0103m Views<\/h3>\n<p>\nDeschidem MainActivity.kt \u0219i ad\u0103ug\u0103m aceasta \u00een func\u021bia initViews (#6):<\/p>\n<pre><code class=\"kotlin\">fun private 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: Leag\u0103 butoanele la Listener\n \n\/\/TODO #16: Leag\u0103 EditText la TextWatcher\n \n}<\/code><\/pre>\n<p><\/p>\n<h3>Finaliz\u0103m butoanele<\/h3>\n<p>\nPentru a ad\u0103uga suport pentru clicurile butoanelor, implement\u0103m View.OnClickListener la nivel de clas\u0103 (#7):<\/p>\n<p>class MainActivity: AppCompatActivity(), View.OnClickListener {<\/p>\n<p>Compilarea proiectului nu va func\u021biona acum, trebuie s\u0103 facem c\u00e2teva ac\u021biuni suplimentare (#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>\n\u00cen ceea ce prive\u0219te butoanele \u0219i comutatoarele, Kotlin este organizat foarte bine! Ad\u0103ug\u0103m codul de mai jos \u00een toate func\u021biile increment \u0219i decrement<br \/>\n (#9\u200a\u2013#12):<\/p>\n<pre><code class=\"kotlin\">fun private incrementTip() {\n        if (tipPercent != MAX_TIP) {\n            tipPercent += TIP_INCREMENT_PERCENT\n            tipTextView.text = String.format(\"%d%%\", tipPercent)\n        }\n    }\n \nfun private decrementTip() {\n        if (tipPercent != MIN_TIP) {\n            tipPercent -= TIP_INCREMENT_PERCENT\n            tipTextView.text = String.format(\"%d%%\", tipPercent)\n        }\n    }\n \nfun private incrementPeople() {\n        if (numberOfPeople != MAX_PEOPLE) {\n            numberOfPeople += PEOPLE_INCREMENT_VALUE\n            numberOfPeopleTextView.text = numberOfPeople.toString()\n        }\n    }\n \nfun private decrementPeople() {\n        if (numberOfPeople != MIN_PEOPLE) {\n            numberOfPeople -= PEOPLE_INCREMENT_VALUE\n            numberOfPeopleTextView.text = numberOfPeople.toString()\n        }\n    }<\/code><\/pre>\n<p>\nCodul de aici protejeaz\u0103 func\u021biile de incrementare cu valorile maxime (MAX_TIP &amp; MAX_PEOPLE). De asemenea, codul protejeaz\u0103 func\u021biile de decrementare cu valorile minime (MIN_TIP &amp; MIN_PEOPLE).<\/p>\n<p>Acum leag\u0103 butoanele de ascult\u0103tori \u00een func\u021bia initViews (#13):<\/p>\n<pre><code class=\"kotlin\">fun private initViews() {\n \n...\n \naddTipButton.setOnClickListener(this)\n        subtractTipButton.setOnClickListener(this)\n \naddPeopleButton.setOnClickListener(this)\n        subtractPeopleButton.setOnClickListener(this)\n \n\/\/TODO #15: Leag\u0103 EditText la TextWatcher\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/73e7477d4b02548aad7c2112c6be5d80.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nAcum putem ad\u0103uga cheltuieli totale, bac\u0219i\u0219 \u0219i num\u0103rul de participan\u021bi la \u00eent\u00e2lnire. \u0218i acum, partea cea mai important\u0103\u2026<\/p>\n<h3>Sec\u021biunea de calculare a cheltuielilor<\/h3>\n<p>Acest cod calculeaz\u0103 cheltuielile (#14):<\/p>\n<pre><code class=\"kotlin\">fun private 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>\nIar aici se apeleaz\u0103 o func\u021bie care permite considerarea num\u0103rului de persoane din grup \u0219i calcularea bac\u0219i\u0219ului (#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>\nLans\u0103m aplica\u021bia. Arat\u0103 \u0219i func\u021bioneaz\u0103 excelent. \u00cens\u0103 ar putea fi \u0219i mai bine.<\/p>\n<p>Dac\u0103 \u00eencerca\u021bi s\u0103 \u0219terge\u021bi suma facturii \u0219i apoi s\u0103 cre\u0219te\u021bi num\u0103rul de tips sau prieteni, aplica\u021bia va cr\u0103pa, deoarece nu exist\u0103 \u00eenc\u0103 o verificare pentru valoarea nul\u0103 a cheltuielilor. \u00cen plus, dac\u0103 \u00eencerca\u021bi s\u0103 schimba\u021bi suma facturii, cheltuielile nu vor fi actualizate.<\/p>\n<h3>Pa\u0219ii finali<\/h3>\n<p>\nAd\u0103ug\u0103m TextWatcher (#16):<\/p>\n<p>class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {<\/p>\n<p>Apoi \u00eencorpor\u0103m ascult\u0103torul billEditText (#17):<\/p>\n<p>billEditText.addTextChangedListener(this)<\/p>\n<p>Plus ad\u0103ug\u0103m cod pentru a executa TextWatcher (#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=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/623256a43c969d8b3a434d10a357c1a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDar acum totul func\u021bioneaz\u0103 perfect! Felicit\u0103ri, a\u021bi scris propriul \u201eCalculatoare de tipsuri\u201d \u00een Kotlin.<\/p>\n<p><img decoding=\"async\" alt=\"Crearea unui calculator de bac\u0219i\u0219uri \u00een Kotlin: cum func\u021bioneaz\u0103?\" src=\"\/wp-content\/uploads\/2019\/04\/5650bfecfadf3fd56785b7d6ac72ed87.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<blockquote><p><b>Skillbox recomand\u0103:<\/b><\/p>\n<ul>\n<li>Curs practic de doi ani <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\">\u201eEu sunt Dezvoltator Web PRO\u201d<\/a><\/noindex>.<\/li>\n<li>Curs online <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\">\u201eDezvoltator C#\u201d<\/a><\/noindex>.<\/li>\n<li>Curs practic anual <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\">\u00abDezvoltator PHP de la 0 la PRO\u00bb<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Sursa: <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.2.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\/ro\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Crearea unui calculator de tipsuri \u00een Kotlin: cum func\u021bioneaz\u0103? | ProHoster","description":"Explic\u0103m cum s\u0103 cre\u0103m un simplu.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/31843","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=31843"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/31843\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/23712"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=31843"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=31843"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=31843"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}