Codering Functionele Android-apps in Kotlin Aan de slag

Hoewel de overgrote meerderheid van Android-apps in Java zijn geschreven, is er geen regel voor u hebben om Java voor Android-ontwikkeling te gebruiken. Er zijn verschillende moderne programmeertalen die zijn ontworpen om te worden uitgevoerd op de Java Virtual Machine (JVM), en een van deze talen die populair wordt in de Java-community is Kotlin. 

In het eerste deel van deze driedelige serie hebben we gekeken naar wat Kotlin is en wat het Android-ontwikkelaars te bieden heeft:

  • Het is 100% uitwisselbaar met Java, tot het punt waarop u bestaande Java-bibliotheken en -frameworks kunt blijven gebruiken en zelfs een combinatie van Java- en Kotlin-code kunt gebruiken in uw Android-projecten. 
  • De syntaxis ervan is ontworpen om erg op Java te lijken, wat betekent dat het voor Java-ontwikkelaars vrij eenvoudig zou moeten zijn om de grondbeginselen van Kotlin onder de knie te krijgen..
  • Het combineert functies en concepten uit zowel functioneel als procedureel programmeren.
  • Het wordt goed ondersteund door Android Studio. 

In deze vervolgstudie gaan we aan de slag met een echte Kotlin-ontwikkeling. Tegen de tijd dat u het einde van de zelfstudie bereikt, hebt u een eenvoudige Android-app gemaakt die een regel tekst weergeeft en die volledig in Kotlin is geschreven. Je zult ook weten hoe je kunt voorkomen dat je ooit nog een nieuwe moet schrijven findViewById, door gebruik te maken van de Android-extensies van Kotlin.

Maar eerst is het tijd om onze ontwikkelingsomgeving een nieuwe taal te leren leren!  

De Kotlin-plug-in installeren in Android Studio

Het allereerste dat u hoeft te doen is Kotlin-ondersteuning toevoegen aan uw Android Studio-installatie.

Voordat we aan de slag gaan, moet je ervoor zorgen dat je de meest recente, stabiele versie van Android Studio gebruikt, omdat je waarschijnlijk meer problemen tegenkomt met de Kotlin-plug-in in experimentele versies van Android Studio. Het is ook de moeite waard om de SDK Manager te openen en te controleren of er updates beschikbaar zijn voor alle pakketten die u hebt geïnstalleerd.

Als u er zeker van bent dat uw ontwikkelomgeving up-to-date is, bent u klaar om de Kotlin-plug-in te installeren. Start Android Studio en u zou het moeten zien Welkom bij Android Studio venster - als dit venster niet wordt weergegeven, sluit Android Studio dan volledig en start het opnieuw.

Geef de configureren pictogram een ​​klik en selecteer vervolgens plugins uit de vervolgkeuzelijst.

Klik op de JetBrains-plug-ins installeren ... knop.

kiezen Kotlin in het menu en klik vervolgens op het groene pictogram Installeren knop. U moet uw IDE opnieuw opstarten voordat de Kotlin-plug-in actief wordt, dus klik op de Start Android Studio opnieuw knop die verschijnt of herstart uw IDE handmatig.

Uw project configureren om Kotlin te gebruiken

Op dit punt kan uw IDE Kotlin-code begrijpen en uitvoeren, maar u moet Kotlin nog steeds configureren wanneer u het in een nieuw project wilt gebruiken. Laten we een nieuw project maken en dat project configureren om Kotlin nu te gebruiken. Maak een nieuw project met de instellingen van uw keuze, maar selecteer voor de eenvoud Lege activiteit als daarom gevraagd wordt.

Dankzij de Kotlin-plug-in kan het configureren van een project om Kotlin te gebruiken niet eenvoudiger zijn: selecteer gewoon Hulpmiddelen van de Android Studio-werkbalk, gevolgd door Kotlin en Configureer Kotlin in Project.

Dit opent een popup waarin je kunt kiezen om Kotlin te configureren voor:

  • alle modules
  • alle modules met Kotlin-bestanden
  • of een enkele, genoemde module

Omdat ik dat ben enkel en alleen Ik ga Kotlin-code gebruiken in mijn project, daar heb ik voor gekozen Alle modules. Je kunt ook kiezen welke versie van Kotlin je wilt gebruiken, meestal is dit de nieuwste versie.  

Als alternatief kunt u Kotlin configureren door te selecteren Helpen via de menubalk van Android Studio, gevolgd door Zoek actie ... In de Zoek actie bar, begin met typen Configureer Kotlin in Project, en selecteer vervolgens deze optie wanneer deze verschijnt.

De Configureer Kotlin in Project optie maakt een aantal aanpassingen aan uw project build.gradle bestanden, dus laten we eens kijken hoe deze bestanden zijn gewijzigd. Open uw projectniveau build.gradle bestand - het zou er ongeveer zo uit moeten zien:

buildscript // Verklaart de versie van Kotlin die u gebruikt. Je zult merken dat de versie van Kotlin wordt genoemd in zowel het klassepad van het buildscript als in de compileerafhankelijkheden van je project - het versienummer moet op beide plaatsen hetzelfde zijn // ext.kotlin_version = '1.0.5-2' repositories jcenter ( ) dependencies classpath 'com.android.tools.build:gradle:2.2.2' // Verklaart de Kotlin Gradle-plug-in als een classpath-afhankelijkheid // classpath "org.jetbrains.kotlin: kotlin-gradle-plugin: $ kotlin_version"  allprojects repositories jcenter () 

Laten we nu eens kijken naar uw moduleniveau build.gradle het dossier:

plug-in toepassen: 'com.android.application' // Past de Kotlin Android-plug-in toe // apply plugin: 'kotlin-android' android compileSdkVersion 25 buildToolsVersion "24.0.0" defaultConfig applicationId "com.jessicathornsby.kotlinexample" minSdkVersion 21 targetSdkVersion 25 versionCode 1 versionName "1.0" buildTypes release minifyEnabled false proguardFiles getDefaultProguardFile ('proguard-android.txt'), 'proguard-rules.pro' // Hoewel Gradle alle Kotlin-bestanden compileert die worden gevonden in src / main / java, het is een goede gewoonte om je Kotlin-bestanden op te slaan in een speciale Kotlin-directory. Hier kun je zien dat de Kotlin-plug-in een src / main / kotlin-verklaring heeft toegevoegd aan build.gradle, maar merk op dat deze map niet echt is gemaakt, dus we zullen het zelf later in dit artikel // sourceSets maken main.java.srcDirs + = 'src / main / kotlin' afhankelijkheden compile fileTree (dir: 'libs', include: ['* .jar']) androidTestCompile ('com.android.support.test.espresso: espresso-core: 2.2.2 ', exclude group:' com.android.support ', module:' support-annotations ') compileer' com.android.support:appcompat-v7:25.0.1 'testCompile' junit: junit: 4.12 '// Voegt de Kotlin Standard Library toe als een projectafhankelijkheid // compile "org.jetbrains.kotlin: kotlin-stdlib: $ kotlin_version" repositories mavenCentral ()

Ten slotte kunt u uw wijzigingen synchroniseren door op te klikken Synchroniseer nu vanuit de pop-up die verschijnt of door op te klikken Synchroniseer Project met Gradle-bestanden pictogram in de werkbalk van Android Studio.

Converteer elk Java-bestand naar Kotlin

Een kenmerk van de Kotlin-plug-in die vooral handig is voor Kotlin-nieuwkomers, is de mogelijkheid om elk Java-bronbestand naar Kotlin te converteren, terwijl de volledige runtime-compatibiliteit behouden blijft.

In staat zijn om precies te zien hoe ieder Java-bestand zou vertalen naar Kotlin is ideaal om u te helpen de taal te leren, maar het kan ook van pas komen tijdens uw Kotlin-reis - als u ooit moeite heeft om iets uit Kotlin te schrijven, kunt u het altijd in Java schrijven en gebruik deze functie om die code om te zetten naar Kotlin.

Laten we onze projecten omzetten Hoofdactiviteit bestand in een Kotlin-bronbestand. Er zijn twee manieren om de Kotlin-plug-ins in te schakelen Converteer Java-bestand naar Kotlin-bestand actie, dus ofwel:

  • Selecteer uw Hoofdactiviteit bestand en selecteer vervolgens Code van de menubalk van Android Studio, gevolgd door Converteer Java-bestand naar Kotlin-bestand.

  • Of selecteer Helpen via de menubalk van Android Studio, gevolgd door Zoek actie. In de daaropvolgende pop-up, begin met typen Converteer Java-bestand naar Kotlin-bestand en selecteer vervolgens deze optie wanneer deze verschijnt. Let op, u kunt ook de Zoek actie pop-up met een sneltoets: als u een Mac gebruikt, drukt u op Command-Shift-A toetsen en als u Windows of Linux gebruikt, drukt u op Ctrl-Shift-A.

Houd er rekening mee dat, afhankelijk van de complexiteit van uw code, de conversie niet altijd 100% nauwkeurig is, dus controleer uw geconverteerde code altijd op fouten.

Je bent pas bekeerd Hoofdactiviteit zou er ongeveer zo uit moeten zien:

invoer android.support.v7.app.AppCompatActivity importeren android.os.Bundelklasse MainActivity: AppCompatActivity () override fun onCreate (savedInstanceState: Bundle?) super.onCreate (savedInstanceState) setContentView (R.layout.activity_main)

Je zult ook opmerken dat de extensie van het bestand is veranderd, transformerend van MainActivity.java naar MainActivity.kt.

Dit kan een simpele zijn Activiteit, maar deze paar regels illustreren enkele hoofdkenmerken van de Kotlin-syntaxis. Omdat dit onze eerste blik op een echte Kotlin-code is, kunnen we deze klasse apart voor elkaar kiezen.

Kotlin Syntax begrijpen

In Kotlin verklaar je klassen die het sleutelwoord gebruiken klasse, precies zoals in Java. In Kotlin zijn klassen (en methoden) echter standaard openbaar en definitief, dus je kunt een klasse eenvoudig schrijven klasse MainActivity.

Als het gaat om het uitbreiden van een klasse, vervang je Java's strekt met een dubbele punt en bevestig vervolgens de naam van de bovenliggende klasse. Dus in de eerste regel van onze MainActivity.kt bestand, we creëren een openbare, uiteindelijke klasse genaamd Hoofdactiviteit dat breidt zich uit AppCompatActivity:

class MainActivity: AppCompatActivity () 

Het Java-equivalent zou zijn:

openbare klasse MainActivity breidt AppCompatActivity uit 

Als u een klasse of methode wilt overschrijven, moet u deze expliciet als open of abstract verklaren.

In Kotlin worden functies gedefinieerd met behulp van de pret sleutelwoord, gevolgd door de functienaam en de parameters tussen haakjes. In Kotlin komt de naam van de functie voor zijn type:

override fun onCreate (savedInstanceState: Bundle?) 

Dit is het tegenovergestelde van Java, waar type voor naam komt:

public void onCreate (Bundle savedInstanceState)

Merk op dat we niet specificeren dat deze methode definitief is, omdat in Kotlin alle methoden standaard zijn.

De rest van deze activiteit lijkt behoorlijk op Java. Deze paar regels illustreren echter nog een ander belangrijk kenmerk van Kotlin:

super.onCreate (savedInstanceState) setContentView (R.layout.activity_main)

In Kotlin doe je dat niet nodig hebben om je lijnen af ​​te maken met puntkomma's, vandaar de afwezigheid van dubbele punten in het bovenstaande fragment. U kunt dubbele punten toevoegen als u dat echt wilt, maar uw code zal schoner en gemakkelijker te lezen zijn zonder hen.

Nu hebben we onze ontcijferd MainActivity.kt bestand, laten we het naar zijn juiste huis verplaatsen. Omdat de Kotlin-plug-in de moeite nam om een src / main / Kotlin verklaring aan onze build.gradle bestand, laten we deze map eigenlijk maken. Deze stap is niet verplicht, maar het bijhouden van uw Kotlin-bestanden in een speciale directory zorgt voor een veel schoner project.

In Android Studio's Projectverkenner, Control en klik jouw projecten Hoofd map en selecteer nieuwe uit het menu dat verschijnt, gevolgd door directory. Geef deze map een naam Kotlin en klik vervolgens op OK.

Als je moeite hebt om je project te herkennen hoofd map en open vervolgens de kleine vervolgkeuzelijst in de linkerbovenhoek van de Projectverkenner en selecteer project. Je zou nu geen problemen hebben om dat ongrijpbare te vinden src / main directory.

Zodra u een toegewijde heeft gemaakt Kotlin map, sleep je MainActivity.kt bestand erin. Zorg er wel voor dat u uw MainActivity.kt bestand bestaande naam van het pakket zodat uw project nog steeds wordt uitgevoerd.

Als je Kotlin alleen in dit project gaat gebruiken, wil je misschien ook de Java directory, in plaats van uw project te volstoppen met lege en onnodige mappen.

Omdat Kotlin compileert naar bytecode, voelt een applicatie die in Kotlin is geschreven precies hetzelfde als een applicatie die in Java is geschreven, dus probeer deze app op je Android-apparaat of een compatibele AVD te installeren - het zou moeten lijken alsof er niets is veranderd.

Extra Kotlin-bestanden maken

Als je in je project met Kotlin blijft werken, moet je vroeg of laat beginnen met het maken van nieuwe Kotlin-bestanden in plaats van het eenvoudig converteren van bestaande Java-bestanden..

Een Kotlin-bestand maken, Control en klik jouw app / src / main / Kotlin map en selecteer Nieuw> Kotlin-activiteit.

Geef je klas een naam en selecteer klasse in het vervolgkeuzemenu. Je nieuwe klas zou er ongeveer zo uit moeten zien:

class SecondActivity 

Op dit punt is uw activiteit leeg. Als u zover bent gekomen dat u echte functionaliteit kunt toevoegen, moet u een paar stappen voltooien. Voeg eerst de importeren verklaringen die u wilt gebruiken. Het enige verschil tussen importinstructies in Kotlin en importinstructies in Java is dat u niet elke regel met een puntkomma hoeft af te werken. Bijvoorbeeld:

import android.app.Activity import android.os.Bundle import android.app.Activity

U moet dan de klasse die u verlengt, opgeven met dezelfde indeling die we hebben gezien in onze MainActivity.kt het dossier:

class SecondActivity: Activity () 

Vervolgens moet u de activiteiten overschrijven onCreate methode:

override fun onCreate (savedInstanceState: Bundle?) super.onCreate (savedInstanceState)

Je kunt nu elke functionaliteit toevoegen die je aan deze activiteit wilt toevoegen (en in de volgende sectie zal ik je laten zien hoe je Kotlin-extensies gebruikt om UI-widgets te manipuleren, dus dit kan een goed begin zijn), maar nog een laatste beetje setup je moet voltooien is het aangeven van je Kotlin-activiteit in je Manifesteren. Dit volgt exact dezelfde formule als het declareren van een nieuwe Java-activiteit, bijvoorbeeld:

   

Kotlin Android-uitbreidingen: Wave Afscheid van findViewById

Nu we de basis onder de knie hebben, laten we eens nader bekijken wat Kotlin is werkelijk in staat om te beginnen met een functie die echt de hoeveelheid boilerplate-code die je moet schrijven, kan verminderen.

In Android, elke keer dat u met een ander wilt werken Uitzicht in een activiteit moet u de findViewById methode om een ​​verwijzing naar die weergave te krijgen. Dit maakt findViewById een van de meest belangrijke, maar ook een van de meest frustrerende stukjes code die je jezelf steeds opnieuw zult vinden, en over- opnieuw in je Android-projecten. De findViewById methode is een enorme bron van potentiële fouten, en als u met meerdere UI-elementen in dezelfde activiteit werkt, dan al die findViewByIds kan je code erg onoverzichtelijk maken, waardoor het moeilijk is om te lezen.

Hoewel er een aantal bibliotheken zijn, zoals Butter Knife, die erop gericht zijn om de noodzaak voor te verwijderen findViewByIds, deze bibliotheken vereisen nog steeds dat je de velden annoteert voor elke weergave, wat kan leiden tot fouten en nog steeds een hoop moeite lijkt die beter zou worden geïnvesteerd in andere gebieden van je project.  

De Kotlin-plug-in voor Android-uitbreidingen (die onlangs is opgenomen in de standaard Kotlin-plug-in) belooft te maken findViewById een ding van het verleden, biedt u de voordelen van de bovengenoemde bibliotheken zonder het nadeel van het hebben van om het even welke extra code te schrijven of een extra runtime te verschepen.

U kunt Kotlin-extensies gebruiken om te importeren Uitzicht referenties in uw bronbestanden. Op dit punt zal de Kotlin-plug-in een set van "synthetische eigenschappen" creëren die u in staat stellen om met deze opvattingen te werken alsof ze deel van uw activiteit uitmaakten, wat betekent dat u niet langer hoeft te gebruiken findViewById om elk te lokaliseren Uitzicht voordat je ermee kunt werken.

Als u extensies wilt gebruiken, moet u de Kotlin-plug-in voor Android-extensies in elke module inschakelen, dus open uw moduleniveau build.gradle bestand en voeg het volgende toe:

plug-in toepassen: 'kotlin-android-extensions'

Synchroniseer deze wijzigingen door op te klikken Synchroniseer nu pop-up. 

U kunt de verwijzingen vervolgens naar een enkele importeren Uitzicht, gebruikmakend van het volgende formaat:

import kotlinx.android.synthetic.main..

Bijvoorbeeld als u acitivity_main.xml bestand bevatte een Tekstweergave met de ID textView1, dan zou je de verwijzing naar deze weergave importeren door het volgende aan je toe te voegen Activiteit:

import kotlinx.android.synthetic.main.activity_main.textView1

Je zou dan toegang kunnen krijgen textView1 binnen deze activiteit door alleen zijn ID te gebruiken - en zonder een findViewById in zicht!

Laten we extensies in actie bekijken, door er een toe te voegen Tekstweergave naar onze activity_main.xml bestand, importeert het in onze MainActivity.kt bestand en extensies gebruiken om de Tekstweergavetekst programmatisch.  

Begin met het maken van uw Tekstweergave:

   

Vervolgens kunt u het importeren Tekstweergave in jouw MainActivity.kt, en stel de tekst in met alleen zijn ID:

import android.support.v7.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.myTextView class MainActivity: AppCompatActivity () override fun onCreate (savedInstanceState: Bundle?) super.onCreate (savedInstanceState ) setContentView (R.layout.activity_main) myTextView.setText ("Hello World")

Opmerking: als u met meerdere widgets in hetzelfde lay-outbestand wilt werken, kunt u de volledige inhoud van een lay-outbestand in één klap importeren met behulp van de volgende formule:

import kotlinx.android.synthetic.main..*

Als u bijvoorbeeld alle widgets van uw wilt importeren activity_main.xml bestand, voeg dan het volgende toe aan uw activiteit:

kotlinx.android.synthetic.main.activity_main. *. 

Conclusie

In dit tweede deel hebben we het opzetten van uw ontwikkelomgeving besproken om Kotlin te ondersteunen en bekeken hoe eenvoudig het is om uw bestaande Java-code in Kotlin om te zetten. We hebben ook gekeken naar enkele van de belangrijkste kenmerken van de Kotlin-syntaxis en Kotlin Android-uitbreidingen geïntroduceerd in ons project. 

In het derde en laatste deel bekijken we enkele meer geavanceerde functies van de Kotlin-taal die je als Android-ontwikkelaar vooral handig vindt.

  • Inzicht in concurrency op Android met behulp van HaMeR

    In deze tutorial verkennen we het HaMeR-framework (Handler, Message en Runnable), een van de krachtigste concurrency-modellen die beschikbaar zijn op Android. U zult ...
    Tin Megali
    Android SDK
  • Aan de slag met Firebase voor Android

    Voor het maken van een back-end-server is een vaardigheden vereist die de meeste onafhankelijke app-ontwikkelaars niet hebben. Gelukkig is er Firebase, een cloudgebaseerd platform dat ...
    Ashraff Hathibelagal
    Android SDK
  • Android From Scratch: hardwaresensoren

    Een van de dingen die het ontwikkelen voor mobiele apparaten anders maken dan andere platforms, is dat een mobiele telefoon of tablet vol zit met sensoren en ...
    Paul Trebilcox-Ruiz
    Android SDK
  • Aan de slag met een Android-app-sjabloon in 60 seconden

    CodeCanyon heeft honderden Android-app-sjablonen die u kunt gebruiken om van start te gaan met uw ontwikkeling. Deze video laat je zien hoe je een ...
    Ashraff Hathibelagal
    Android SDK
  • Neem foto's met uw Android-app

    De Google Play Store heeft tientallen camera-apps, elk met een andere manier om foto's te maken of iets unieks te doen met de foto's van de ...
    Ashraff Hathibelagal
    Android SDK
  • Praktische concurrency op Android met HaMeR

    In deze tutorial verkennen we het HaMeR-framework (Handler, Message en Runnable), een van de krachtigste concurrency-modellen die beschikbaar zijn op Android. Met een…
    Tin Megali
    Android SDK