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