{"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\/de\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet","title":{"rendered":"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/faaae0beaf023f1c11bb9102312fe429.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nWir erz\u00e4hlen, wie man eine einfache Anwendung zur Berechnung von Trinkgeldern in Kotlin erstellt. Genauer gesagt, Kotlin 1.3.21, Android 4, Android Studio 3. Der Artikel wird in erster Linie f\u00fcr diejenigen interessant sein, die ihren Weg in die Entwicklung von Android-Anwendungen beginnen. Er hilft zu verstehen, was und wie innerhalb der Anwendung funktioniert. <\/p>\n<p>Ein solcher Rechner ist n\u00fctzlich, wenn man die Trinkgeldsumme f\u00fcr eine Gesellschaft berechnen muss, die beschlossen hat, Zeit in einem Restaurant oder Caf\u00e9 zu verbringen. Nat\u00fcrlich lassen nicht alle und nicht immer Trinkgeld, das ist eher eine westliche Tradition, aber der Prozess der Entwicklung einer solchen Anwendung ist auf jeden Fall interessant. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<blockquote><p><b>Wir erinnern daran:<\/b> <i>alle Leser von \u201eHabr\u201c erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode \u201eHabr\u201c.<\/i><\/p>\n<p><b>Skillbox empfiehlt:<\/b> Praktischer Kurs <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\">\u201eMobiler Entwickler PRO<\/a><\/noindex>.\n<\/p><\/blockquote>\n<p>\nSo sieht die Anwendung w\u00e4hrend des Betriebs aus:<\/p>\n<p><img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/fa375744a4ca5d07667ec494db38648b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nSie geben den gew\u00fcnschten Prozentsatz von der Gesamtsumme, die Anzahl der Teilnehmer am Treffen ein und erhalten das Ergebnis \u2013 die Trinkgeldsumme, die man lassen sollte.<\/p>\n<h3>Starten wir<\/h3>\n<p>\nDie vollst\u00e4ndige Benutzeroberfl\u00e4che der Anwendung sieht wie folgt aus:<br \/>\n<img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/e95058f09c4a6c151b6c5500ae549c0e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/ac31c73ade24640078c76d71700de0b4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nErster Schritt \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lawreyios\/tipcalculator\/tree\/starter_project\">Laden der Projektgrundlage<\/a><\/noindex>. \u00d6ffnen Sie es in Android Studio 3.0 oder einer neueren Version. Bauen Sie das Projekt und starten Sie es, und sehen Sie einen wei\u00dfen Bildschirm. Alles in Ordnung, das sollte so sein.<\/p>\n<p><img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/f4e3361ddc45d56794cc5c7c36d8b206.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\n<img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/7828c10dcb3936eb095f5110094ea8bf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nDie Benutzeraktionen sind im Projekt in chronologischer Reihenfolge festgelegt, damit alles verst\u00e4ndlich ist. Um sie anzuzeigen, \u00f6ffnen Sie Ansicht -&gt; Werkzeugfenster -&gt; TODO.<\/p>\n<p>Wir untersuchen das Projekt und \u00f6ffnen colors.xml zur Bewertung der Farbpalette. In strings.xml befinden sich die Textdaten (Beschriftungen), und in styles.xml gibt es einige Schriftvorlagen.<\/p>\n<h3>Entwicklung des Kostenabschnitts<\/h3>\n<p>\n\u00d6ffnen Sie activity_main.xml und f\u00fcgen Sie den untenstehenden Code in LinearLayout (#1) hinzu:<\/p>\n<pre><code class=\"kotlin\"><\/code><\/pre>\n<p>\nJetzt k\u00f6nnen Sie den Stil des Verzeichnisses values anpassen oder mit Farben spielen, indem Sie <noindex><a rel=\"nofollow\" href=\"https:\/\/material.io\/tools\/color\/#!\/?view.left=0&amp;view.right=0&amp;primary.color=37474F\">das tool material.io verwenden<\/a><\/noindex>.<\/p>\n<p>Jetzt sieht das Projekt so aus:<\/p>\n<p><img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/ab47023cafd97fdbd171a9d9a1c35dd5.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i> Wie Sie sehen k\u00f6nnen, werden die Kosten anhand der Daten berechnet, die der Benutzer eingibt. <\/i><\/p>\n<h3>Entwicklung des Rechnungsabschnitts<\/h3>\n<p>\nF\u00fcgen Sie den untenstehenden Code in LinearLayout nach dem Kostenabschnitt (#2) hinzu:<\/p>\n<pre><code class=\"kotlin\">&lt;! \u2014 TODO #3: Rechnungsabschnitt erstellen \u2192\n \n\u2026<\/code><\/pre>\n<p>\nWir schlie\u00dfen das LinearLayout nach der TODO-Liste und f\u00fcgen dann neuen Code hinzu, indem wir ihn innerhalb des LinearLayout (#3) platzieren:<\/p>\n<pre><code class=\"kotlin\"><\/code><\/pre>\n<p>\nDa die Hauptaufgabe der Anwendung darin besteht, die individuellen Ausgaben f\u00fcr jeden der Teilnehmer im Restaurant zu berechnen, spielt costPerPersonTextView eine entscheidende Rolle. <\/p>\n<p>EditText beschr\u00e4nkt die Eingabe auf eine Zeile, dieser Parameter sollte den Wert NumberDecimal inputType haben.<\/p>\n<p><img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/7dc4e90d8188a08933e7a92b119472ee.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i> Wir starten das Projekt zu Testzwecken und geben die Parameter des Gesamtschadens ein (z.B. zerbrochene Tassen, Teller usw.)<\/i><\/p>\n<h3>Entwicklung des Abschnitts \u201ePersonen und Trinkgeld\u201c<\/h3>\n<p>\nUm die Auswahl der Trinkgeldh\u00f6he hinzuzuf\u00fcgen, f\u00fcgen wir den folgenden Code in den neuen Abschnitt LinearLayout (#4) ein:<\/p>\n<pre><code class=\"kotlin\"><\/code><\/pre>\n<p>\nDieser Codeabschnitt ist notwendig f\u00fcr die genaue Berechnung des Trinkgeldbetrags. Der Standardwert des Textes betr\u00e4gt 20. Die ImageButtons sind mit Icons im schreibgesch\u00fctzten Ordner ausgestattet.<\/p>\n<p>Wir kopieren den Abschnitt vollst\u00e4ndig und f\u00fcgen das Folgende hinzu (#5):<\/p>\n<ul>\n<li> ImageButton-IDs (subtractPeopleButton, addPeopleButton)<\/li>\n<li> TextView-IDs (numberOfPeopleStaticText, numberOfPeopleTextView)<\/li>\n<li> Standardtext f\u00fcr numberOfPeopleTextView (sollte 4 sein).<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/df99acfb33c3d27126db807b805c9c87.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nJetzt gibt es beim Start der Anwendung die M\u00f6glichkeit, den Rechnungsbetrag hinzuzuf\u00fcgen, die Tasten \u201eHinzuf\u00fcgen\/Verringer\u201c funktionieren auch, aber es passiert noch nichts.<\/p>\n<h3>Wir f\u00fcgen Views hinzu<\/h3>\n<p>\n\u00d6ffnen Sie MainActivity.kt und f\u00fcgen Sie Folgendes in die Funktion initViews (#6) ein:<\/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: Binde die Buttons an den Listener\n \n\/\/TODO #16: Binde EditText an TextWatcher\n \n}<\/code><\/pre>\n<p><\/p>\n<h3>Wir vervollst\u00e4ndigen die Buttons<\/h3>\n<p>\nUm die Klickunterst\u00fctzung f\u00fcr die Buttons hinzuzuf\u00fcgen, implementieren wir View.OnClickListener auf Klassenebene (#7):<\/p>\n<p>class MainActivity: AppCompatActivity(), View.OnClickListener {<\/p>\n<p>Das Projekt kann jetzt nicht kompiliert werden, da wir noch einige Schritte ausf\u00fchren m\u00fcssen (#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>\nIn Bezug auf Buttons und Schalter ist Kotlin wirklich gro\u00dfartig organisiert! F\u00fcgen Sie den unten stehenden Code in alle Funktionen zum Inkrementieren und Dekrementieren ein<br \/>\n (#9\u200a\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>\nHier sch\u00fctzt der Code die Inkrementierungsfunktionen mit maximalen Werten (MAX_TIP &amp; MAX_PEOPLE). Dar\u00fcber hinaus sch\u00fctzt der Code die Dekrementierungsfunktionen mit minimalen Werten (MIN_TIP &amp; MIN_PEOPLE).<\/p>\n<p>Jetzt binden wir die Buttons an die Listener in der Funktion initViews (#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: Binde EditText an TextWatcher\n}<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/73e7477d4b02548aad7c2112c6be5d80.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nJetzt k\u00f6nnen wir die Gesamtausgaben, Trinkgelder und die Anzahl der Teilnehmer an der Besprechung hinzuf\u00fcgen. Und jetzt das Wichtigste \u2026<\/p>\n<h3>Bereich zur Kostenaufstellung<\/h3>\n<p>Dieser Code berechnet die Ausgaben (#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>\nHier wird eine Funktion aufgerufen, die es erm\u00f6glicht, die Anzahl der Personen in der Gruppe zu ber\u00fccksichtigen und das Trinkgeld zu berechnen (#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>\nWir starten die Anwendung. Sie sieht gut aus und funktioniert hervorragend. Aber es k\u00f6nnte noch besser sein.<\/p>\n<p>Wenn Sie versuchen, den Betrag der Rechnung zu l\u00f6schen und dann die Anzahl der Tipps oder Freunde zu erh\u00f6hen, wird die Anwendung abst\u00fcrzen, da es noch keine \u00dcberpr\u00fcfung auf den Nullwert der Ausgaben gibt. Dar\u00fcber hinaus werden die Ausgaben nicht aktualisiert, wenn Sie versuchen, den Betrag der Rechnung zu \u00e4ndern.<\/p>\n<h3>Letzte Schritte<\/h3>\n<p>\nWir f\u00fcgen einen TextWatcher hinzu (#16):<\/p>\n<p>class MainActivity: AppCompatActivity(), View.OnClickListener, TextWatcher {<\/p>\n<p>Dann integrieren wir den Listener billEditText (#17):<\/p>\n<p>billEditText.addTextChangedListener(this)<\/p>\n<p>Au\u00dferdem f\u00fcgen wir den Code f\u00fcr die Ausf\u00fchrung des TextWatchers hinzu (#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=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/623256a43c969d8b3a434d10a357c1a0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNun funktioniert alles einwandfrei! Gl\u00fcckwunsch, Sie haben Ihren eigenen \u201eTip Rechner\u201c in Kotlin geschrieben.<\/p>\n<p><img decoding=\"async\" alt=\"Erstellung eines Trinkgeldrechners in Kotlin: Wie funktioniert das?\" src=\"\/wp-content\/uploads\/2019\/04\/5650bfecfadf3fd56785b7d6ac72ed87.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<blockquote><p><b>Skillbox empfiehlt:<\/b><\/p>\n<ul>\n<li>Zweij\u00e4hriger praktischer Kurs <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\">\u201eIch bin Webentwickler PRO\u201c<\/a><\/noindex>.<\/li>\n<li>Online-Kurs <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\">\u201eC#-Entwickler\u201c<\/a><\/noindex>.<\/li>\n<li>Praktischer Jahreskurs <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\">\u201ePHP-Entwickler von 0 bis PRO\u201c<\/a><\/noindex>.\n<\/li>\n<\/ul>\n<\/blockquote>\n<p>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47 Erstellen eines Trinkgeldrechners in Kotlin: wie funktioniert das? | ProHoster","description":"Wir erkl\u00e4ren, wie man es einfach erstellt.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/news\/sozdanie-kalkulyatora-chaevyh-na-kotlin-kak-eto-rabotaet","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/31843","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=31843"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31843\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/23712"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=31843"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=31843"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=31843"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}