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
Johdanto[muokkaa]
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
- val nimi = listOf("mansikka", "mustikka")
- 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
- val nimi: MutableList<String> = mutableListOf("mansikka", "mustikka")
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.
- Asenna Android Studio -sovellus internetistä tietokoneelle.
- 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.
- 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.
- Klikataan Build & Refresh esikatseluvälilehdessä. Hetken kuluttua tulostuu Hello Android!
- Koodi on tiedostossa MainActivity.kt
- package com.example.nimi
- import ... // ???
- class MainActivity : ComponentActivity() // ???
- onCreate() -funktio kutsuu muut funktiot ja on sama kuin Kotlin-ohjelmointikielen main() -funktio. Tässä olevia käytetään Android-puhelimen sovelluksessa.
- override fun onCreate(savedInstanceState: Bundle?) // ???
- super.onCreate(savedInstanceState) // ???
- setContent() -funktio asettaa sovelluksen ulkoasun.
- 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.
- @Preview yhdessä @Composable kanssa näyttää sovelluksen Android Studion esikatseluväilehdellä. @Preview alla olevat funktiot eivät vaikuta sovellukseen, joka pyörii Android-puhelimessa.
- GreetingPreview() -funktio näyttää muutokset ilman että koko sovelluta tarvitsee aina uudelleen kääntää tietokoneen ymmärtämäksi.
- Greeting() -funktio tulostaa sille annetun nimen saatetekstillä.
- Androidissa asetetaan USB debugging: Asetukset > Sovelluskehittäjien asetukset > USB-vianetsintä (USB debuggin).
- Kytketään Android tietokoneeseen USB-kaapelilla tai Wi-Fi-yhteydellä.
- USB-yhteys: Kytketään kaapeli
- 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.
- Klikataan Run Android Studion Play-painiketta yläosassa ikkunassa > sovellus käynnistyy hetken kuluttua Androidissa ja lisää ohjeen alussa nimetyn nimisen sovelluksen valikkoon.
- 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.
- Kytketään ääni macOS: Android Studio > Settings > Tools > Device Mirroring > Redirect audio from local devices.
Kotlin-sovellus puhelimeen 2[muokkaa]
- Asenna Android Studio -sovellus internetistä tietokoneelle.
- 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.
- Avataan activity_main.xml -tiedosto, joka sijaitsee Android > app/res/layout > valitaan oikeasta yläkulmasta 4 viivaa (Code).
- Jos tiedostoa ei ole: klikataan res-kansiota hiiren oikealla > New > Android Resource File > File name: activity_main.xml > Resource type: Layout > OK