Voit itse lisätä ja muuttaa sisältöä muokkaa-painikkeiden avulla

Ennen tallennusta suositellaan ottamaan kopio muokkausruudusta (ctrl-a -> ctrl-c)

 Olet itse vastuussa tämän teoksen käytöstä aiheutuvista vahingoista Lue lisää.

Kotlin

Wikikko - kansan taitopankkista
Siirry navigaatioon Siirry hakuun

Johdanto[muokkaa]

Kotlin Programming Language

Ohjelmointikieli erityisesti Android-laitteille. Yhteensopiva Javan ja muiden ohjelmointikielien kanssa.

Sivulla käytettävät otsikot ja nimet eivät ole yleisesti käytettyjä. Ne voi muuttaa vapaasti sellaisiksi.

Komennot[muokkaa]

Funktio[muokkaa]

  • fun määrittää funktion
    • fun funktionimi() { ... }
  • Funktion nimi aloitetaan pienellä kirjaimella ja uusi sana aloitetaan isolla kirjaimella ja kaikki sanat kirjoitetaan yhteen. Android Studiossa aloitetaan isolla alkukirjaimella @Composable-funktiot.
  • Funktion parametrit ovat () sisällä. Parametri sisältää tyypin. Parametrit erotetaan pilkulla. Palautettava tyyppi määritellään : jälkeen.
  • Funktion toiminto on {} sisällä.
  • return poistuu funktiosta esimerkiksi kun ehto täyttyy tai palauttaa jotain funktiosta. Return ei tarvitse käyttää jos palautetaan 1 arvo???
    • fun main() { ... } Ohjelmat aloitetaan main-funktiolla ja kirjoitetaan hakasulkeiden sisään.
fun funktionimi() {
    return println("teksti")
}
fun main () {
    funktionimi()
}
val nimi2 = mutableListOf ("mansikka")
fun funktionimi(nimi: String): String {
    if (nimi in nimi2) {
        return "Löytyy luettelosta."
    }
    nimi2.add(nimi) // mustikkaa ei ollut luettelossa joten lisätään
    return "Uusi nimi lisätty."
}
fun main() {
println(funktionimi("mustikka"))
fun funktionimi(nimi: String, nimi2: String) {
// fun funtionimi(nimi: String, nimi2: String = "teksti") { // oletusarvolla
    println("$nimi $nimi2")
}
fun main() {
funktionimi(nimi = "teksti", nimi2 = "teksti2")
funktionimi("teksti", "teksti2")
// funktionimi("teksti") // nimi2 käyttää oletusarvoa
fun funktionimi(a: Int, b: Int): Int { 
    return a * b
}
fun main () {
    println(funktionimi(2, 3))
fun funktionimi(a: Int, b: Int) = a * b
fun main () {
    prinln(funktionimi(2, 3))
}


  • Osaan funktioista viitataan esim. println("Ensimmäinen on ${listanimi.first()}")

Lambada[muokkaa]

  • Kirjoitetaan {} sisään
  • Parametrien jälkeen -> ja sen jälkeen funktio
val nimi2 = { nimi: String -> nimi.uppercase() }

Funktioita[muokkaa]

  • Muunnos isoiksi kirjaimiksi
    • return nimi.uppercase()

Jos (if), kun (when)[muokkaa]

Suositeltavaa käyttää when.

  • when
    • Vertailtava arvo asetetaan () sisään ja ehdot ja toiminta {} sisään. Etsii järjestyksessä kunnes ehto täsmää ja tässä tulostaa sen.
    • Statement ei palauta mitään
val nimi = "punainen"
val nimi2 = when (nimi) {
"vihreä" -> "raaka"
"punainen" -> "kypsä"
else -> "tuntematon"
println(nimi2)
val nimi = "mansikka"
when (nimi) {
"mustikka" -> println("mustikka")
"mansikka" -> println("mansikka on oikein")
else -> println("ei löydy")
}
val nimi = "mansikka"
val nimi2 = when {
    nimi == "punainen" -> "kypsä"
    nimi == "vihreä" -> "raaka"
    else -> "tuntematon"
}
println(nimi2)


  • Expression palauttaa arvon. Etsii järjestyksessä kunnes ehto täsmää ja tallentaa arvon muuttujaan.
val nimi = "mansikka"
val tulos = when (nimi) {
"mustikka" -> "mustikka"
"mansikka" -> "mansikka on oikein"
else -> "ei löydy"
println(tulos)


  • if
    • Ehto asetetaan () sisään ja toiminta {} sisään.
val nimi: Int
val nimi2 = true
if (nimi2 { // on tosi eli true
    nimi = 10
} else { // on epätosi
    nimi = 20
}
val nimi = 10
val nimi2 = 20
println(if (nimi < nimi2) nimi else nimi2) // tulostaa 10

Tiedon syöttäminen[muokkaa]

  • 'readln // lukee koko rivin
println("Kirjoita jotain: ")
val nimi = readln()
print(nimi)
val numero = readln().toInt()

Tulostus[muokkaa]

  • print // tulostaa esimerkiksi tekstin
    • print("teksti")
  • println // tulostaa esimerkiksi tekstin ja lisää rivinvaihdon
    • println("teksti")
    • println(10)
    • println(muuttujanimi)
    • println("Muuttujan arvo on $muuttujanimi")
    • println("Muuttujan arvo lisättynä viidellä on ${muuttujanimi + 5}") // voi olla myös val

Toisto[muokkaa]

1..3 tarkoittaa 1, 2, 3
'a'..'c' tarkoittaa 'a', 'b', 'c'
1..<3 tarkoittaa 1, 2
3 downTo 1 tarkoittaa 3, 2, 1
'e' downTo 'a' step 2 tarkoittaa 'e', 'c', 'a'
1..5 step 2 tarkoittaa 1, 3, 5 
  • for
    • Määrätyllä alueella toimintojen suorittaminen.
for (nimi in 1..3) {
print(nimi)
val nimi = listOf ("mansikka", "mustikka", "puolukka")
for (nimi2 in nimi) {
println("Tulostetaan $nimi2")
}
  • while
    • Toimintojen suorittaminen kunnes määrätty ehto on totta.
    • Ehto () sisään ja toiminta {} sisään.
var nimi = 0
while (nimi < 5) {
    println("tuloste")
    nimi++
}
  • 'do-while
    • Ensin suoritetaan määrättyä toimintoa X kertaa ja sitten seuraavaa toimintoa X kertaa.
var nimi = 0
var nimi2 = 0
while (nimi < 5) {
    println("tuloste") // tulostetaan 5 kertaa
}
do {
    println("tuloste2") // tulostetaan 5 kertaa
    nimi2++
} while (nimi2 < nimi) 

Kommentti[muokkaa]

  • // kommentti

Muuttujat[muokkaa]

Muuttujiin tallennetaan tietoa. Muuttuja voidaan määritellä main()-funktion ulkopuolella.

  • val vain luettava muuttuja, jonka arvoa ei voida muuttaa määrittelyn jälkeen. Pääsääntöisesti näitä.
    • val nimi = 5
  • var muuttuja, jonka arvoa voidaan muuttaa.
    • var nimi = 10
    • nimi += 10 tai nimi = nimi + 10
    • nimi -= 10 tai nimi *=10 tai nimi /=10 tai nimi %=

Tyypit[muokkaa]

  • Merkkijono String
    • val nimi: String = "teksti"
  • Kokonaisarvot Byte, Short, Int, Long
    • val nimi: Int = 10
  • Float, Double
    • val hinta: Double = 9.99
  • Boolean
    • val nimi: Boolean = false
  • Char
    • val nimi: Char = "-"
  • UByte, Ushort, Uint, ULong
  • Muuttujan "muoto" voidaan määritellä myös ilman arvoa:
val nimi: Int
nimi = 10

Luettelo[muokkaa]

List[muokkaa]

Useita artikkeleita luettelossa.

  • ListOf() vain lukukäyttö
    • val nimi = listOf("mansikka", "mustikka")
      • println("Listan ensimmäinen on ${nimi[0]}") // luettelon määrätyn artikkelin tulostaminen
      • println("Listan ensimmäinen on ${nimi.first()}") tai viimeinen .last()
      • println("Listassa on ${nimi.count()} artikkelia") // listassa olevien lukumäärä
      • println("mustikka" in nimi) // luettelossa olevan artikkelin olemassa olon tarkistaminen, vastaus true/false
  • mutableListOf() lista, jonka artikkeleiden tyyppi on määritelty.
    • val nimi: MutableList<String> = mutableListOf("mansikka", "mustikka")
      • val nimiLukittu: List<String> = nimi // luettelon lukitseminen
      • nimi.add("puolukka") // artikkelin lisääminen listan loppuun
      • nimi.remove("mansikka") // ensimmäisen nimeen sopivan artikkelin poistaminen listalta

Set[muokkaa]

Vain yksi kutakin samaa artikkelia huomioidaan luettelossa, vaikka olisi luettelossa useampi sama artikkeli. Ei järjestystä, jolloin listalta ei voida poimia määrättyä artikkelia.

  • setOf() vain lukukäyttö
    • val nimi = setOf("mansikka", "mustikka")
    • println("Luettelossa on ${nimi.count()} artikkelia") // luettelossa olevien lukumäärä
    • println("mustikka" in nimi) // luettelossa olevan artikkelin olemassa olon tarkistaminen, vastaus true/false


  • mutableSetOf()
    • val nimi: MutableSet<String> = mutableSetOf("mansikka", "mustikka")
    • val nimiLukittu: Set<String> = nimi // luettelon lukitseminen
      • nimi.add("puolukka") // artikkelin lisääminen listan loppuun
      • nimi.remove("mansikka") // artikkelin poistaminen listalta

Map[muokkaa]

Artikkeleiden tallentaminen avainpareina. Arvo saadaan avainta pyytämällä. Avaimen täytyy olla ainutkertainen luettelossa.

  • mapOf()
    • val nimi = mapOf"mansikka" to 10, "mustikka" to 20)
    • println("Mustikan arvo on ${nimi["mustikka"]}") // artikkelin arvon tulostaminen
    • println(nimi.keys) // avaimien tulostus (tässä keys on ominaisuus eli property)
    • println(nimi.values) // arvojen tulostus
    • println("Luettelossa on ${nimi.count()} avainparia") // luettelossa olevien lukumäärä
    • println(nimi.containsKey("mustikka")) // luettelossa olevan artikkelin olemassa olon tarkistaminen, vastaus true/false
    • println("mustikka" in nimi) // luettelossa olevan avaimen olemassa olon tarkistaminen, vastaus true/false
    • println("mustikka" in nimi.keys) // luettelossa olevan avaimen olemassa olon tarkistaminen, vastaus true/false
    • println("10" in nimi.values) // luettelossa olevan arvon olemassa olon tarkistaminen, vastaus true/false


  • mutableMapOf()
    • val nimi: MutableMap<String, Int> = mutableMapOf("mansikka" to 10, "mustikka" to 20)
    • val nimiLukittu: Map<String, Int> = nimi // luettelon lukitseminen
    • nimi["puolukka"] = 30 // lisätään uusi avainpari luettelon loppuun
    • nimi.remove("puolukka") // poistetaan avainpari


Luokka[muokkaa]

  • Luokka (class) määrittelee objektin luonteen.
  • Objekti (object) soveltuu tiedon tallentamiseen. Objekti luodaan luokasta.
  • class Luokkannimi // luokan määrittäminen
  • class Luokkanimi(val nimi: String, var nimi2: Int) // luokan ominaisuuksien määrittäminen
class Luokkanimi(var nimi: String = "teksti", var nimi2: Int) {
    val nimi3: String = ""
}
  • Objektin luominen luokasta tehdään määrittelemällä instanssi käyttäen konstruktoria.
class Luokkanimi(val nimi: String, var nimi2: Int) // luokka
fun main() {
    val instanssinimi = Luokkanimi("teksti", 10) // luodaan luokan instanssi ominaisuuksilla (property)
    println(instanssinimi.nimi) // tulostetaan ominaisuus
    instanssinimi.nimi = "uusiteksti" // muutetaan ominaisuus
    println("Ominaisuus on ${instanssinimi.nimi}")
    println(instanssinimi.copy()) // luodaan kopio
    println(instanssinimi.copy("teksti2")) // luodaan kopio nimellä teksti2
    println(instanssinimi.copy(nimi2 = 20)) // luodaan lopio teksti2 arvolla 20
}
class Luokkanimi(val nimi: String, var nimi2: Int) {
    fun funktionimi() {
        println(nimi)
    }
}
fun main() {
val instanssinimi = Luokkanimi("teksti", 10)
instanssinimi.funktionimi()

Data classes[muokkaa]

Valmiita luokkia Kotlinissa.

  • data class Luokkanimi(val nimi: String, var nimi2: Int)

Null[muokkaa]

Kun jotain ei ole vielä määritelty tai puuttuu. Oletuksena null-arvoa ei hyväksytä ja annetaan virheilmoitus. Hyväksyntä tehdään kysymysmerkillä (?).

fun main() {
    var eiKoskaanNull: String = "Arvo ei voi olla tyhjä."
    eiKoskaanNull = null
    var nullArvo: String? = "Arvoi voi olla tyhjä."
    nullArvo = null
}
  • Arvon tarkastaminen
fun tarkastus(tarkastettava: String?): String {
    if (tarkastettava != null && tarkastettava.length > 0) {
        return "Pituus on ${tarkastettava.length}."
    } else {
        return "Tyhjä."
    }
}
fun main() {
    val tarkasta: String? = null
    println(tarkastus(tarkasta))
}
  • Objektin ominaisuus, joka saattaa sisältää null-arvon
fun pituusTarkistus(tarkastettava: String?): Int? = tarkastettava?.length
fun main() {
    val tarkasta: String? = null
    println(pituusTarkitus(tarkasta))
}
  • Elvis-operaattori palauttaa nolla-arvon
fun main() {
    val tarkasta: String? = null
    println(tarkasta?.length ?: 0)
}

Android[muokkaa]

  • Sovelluspaketti, esim. MainActivity.kt alkaa paketin määrittelyllä
package nimi
import ...
  • enableEdgeToEdge() // sovellus täyttää koko näytön

Android Studio[muokkaa]

Sovellus, jossa voidaan tehdä Android-sovelluksia. Kyseessä on Integrated Development Environment (IDE). Käyttöä helpottaa Java ja Kotlin -ohjelmointikielien hallinta.

Tiedostojärjestelmä[muokkaa]

Ruudun vasemmassa laidassa Project-välilehti. Valitaan tarvittaessa pudotusvalikosta Android, joka sisältää projektin tiedostot ja kansiot Android Studion esittämässä järjestyksessä. Pudotusvalikon project Source Files näyttää tiedostot samalla tavoin kuin tietokoneen tiedostojärjestelmässä.

Kotlin-sovellus puhelimeen 1[muokkaa]

Seuraavassa ohjeessa avataan Android Studion mukana tuleva Hello Andoid! ja siirretään se Android-puhelimeen sovellukseksi.

  1. Asenna Android Studio -sovellus internetistä tietokoneelle.
  2. Käynnistä sovellus > New Project > Phone and Tablet > Empty Activity // Ikkunassa valitaan tulevaan projektiin sopiva pohja, joka sisältää valmiiksi ohjelmointia tukevia osia. > annetaan projektille vapaamuotoinen nimi > Finish > odota.
  3. Klikataan Split-ikonia oikeassa yläkulmassa. Vasemmalla näkyy nyt projektin tiedostot, keskellä Kotlin-koodi ja oikealla esikatseluvälilehdessä miltä sovellus näyttää Androidin näytöllä. Tehtäessä muutoksia koodiin, se päivittyy automaattisesti esikatseluvälilehteen.
  4. Klikataan Build & Refresh esikatseluvälilehdessä. Hetken kuluttua tulostuu Hello Android!
  5. Koodi on tiedostossa MainActivity.kt
    1. package com.example.nimi
    2. import ... // ???
    3. class MainActivity : ComponentActivity() // ???
    4. onCreate() -funktio kutsuu muut funktiot ja on sama kuin Kotlin-ohjelmointikielen main() -funktio. Tässä olevia käytetään Android-puhelimen sovelluksessa.
      1. override fun onCreate(savedInstanceState: Bundle?) // ???
      2. super.onCreate(savedInstanceState) // ???
    5. setContent() -funktio asettaa sovelluksen ulkoasun.
    6. Kaikkia funktioita, joissa on @Composable-viittaus ennen funktiota, voidaan kutsua muista funktioista. @Composable-funktio ottaa jotain sisään mikä näytetään näytöllä, mutta funktio ei palauta mitään arvoa.
    7. @Preview yhdessä @Composable kanssa näyttää sovelluksen Android Studion esikatseluväilehdellä. @Preview alla olevat funktiot eivät vaikuta sovellukseen, joka pyörii Android-puhelimessa.
    8. GreetingPreview() -funktio näyttää muutokset ilman että koko sovelluta tarvitsee aina uudelleen kääntää tietokoneen ymmärtämäksi.
    9. Greeting() -funktio tulostaa sille annetun nimen saatetekstillä.
  6. Androidissa asetetaan USB debugging: Asetukset > Sovelluskehittäjien asetukset > USB-vianetsintä (USB debuggin).
  7. Kytketään Android tietokoneeseen USB-kaapelilla tai Wi-Fi-yhteydellä.
    1. USB-yhteys: Kytketään kaapeli
    2. Wi-Fi-yhteys: Yhdistetään Android-puhelin ja tietokone samaan Wi-Fi-verkkoon > klikataan ikkunan yläosasta Pixel 5-valikosta Pair Devices Using Wi-Fi > valitaan puhelimesta Asetukset > Sovelluskehittäjien asetukset > otetaan käyttöön Langaton virheenkorjaus > valitaan Langaton virheenkorjaus -kohdasta Muodosta laitepari QR-koodilla tai koodilla > skannataan Android Studion ponnahdusikkunan QR-koodi tai syötetään koodi.
  8. Klikataan Run Android Studion Play-painiketta yläosassa ikkunassa > sovellus käynnistyy hetken kuluttua Androidissa ja lisää ohjeen alussa nimetyn nimisen sovelluksen valikkoon.
  9. Peilaus (mirroring) ja Androidin käyttö hiirellä Android Studiosta. Kytketyn laitteen näyttö voidaan peilata Android Studioon: Android Studio > View > Tool Windows > Device Manager > klikataan pientä kuvaketta puhelimen nimen vieressä oikealla ja hyväksytään varoitus.
    1. Kytketään ääni macOS: Android Studio > Settings > Tools > Device Mirroring > Redirect audio from local devices.

Kotlin-sovellus puhelimeen 2[muokkaa]

  1. Asenna Android Studio -sovellus internetistä tietokoneelle.
  2. Käynnistä sovellus > New Project > Phone and Tablet > Empty Activity // Ikkunassa valitaan tulevaan projektiin sopiva pohja, joka sisältää valmiiksi ohjelmointia tukevia osia. > annetaan projektille vapaamuotoinen nimi > Finish > odota.
  3. Avataan activity_main.xml -tiedosto, joka sijaitsee Android > app/res/layout > valitaan oikeasta yläkulmasta 4 viivaa (Code).
    1. Jos tiedostoa ei ole: klikataan res-kansiota hiiren oikealla > New > Android Resource File > File name: activity_main.xml > Resource type: Layout > OK

Lähteet[muokkaa]

https://kotlinlang.org/docs