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ää.
Ero sivun ”Kotlin” versioiden välillä
Ei muokkausyhteenvetoa |
Ei muokkausyhteenvetoa |
||
| Rivi 10: | Rivi 10: | ||
* '''fun''' määrittää funktion | * '''fun''' määrittää funktion | ||
** fun funktionimi() { ... } | ** fun funktionimi() { ... } | ||
* Funktion nimi aloitetaan pienellä kirjaimella ja uusi sana aloitetaan isolla kirjaimella ja kaikki sanat kirjoitetaan yhteen. | * 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 parametrit ovat () sisällä. Parametri sisältää tyypin. Parametrit erotetaan pilkulla. Palautettava tyyppi määritellään : jälkeen. | ||
* Funktion toiminto on {} sisällä. | * Funktion toiminto on {} sisällä. | ||
| Rivi 309: | Rivi 309: | ||
} | } | ||
== Android Studio == | |||
Sovellus, jossa voidaan tehdä Android-sovelluksia. | |||
=== Tiedostojärjestelmä === | |||
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 === | |||
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. | |||
== Android == | |||
* enableEdgeToEdge() // sovellus täyttää koko näytön | |||
== Lähteet == | == Lähteet == | ||
Versio 1. toukokuuta 2025 kello 21.18
Johdanto
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
Funktio
- 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
- Kirjoitetaan {} sisään
- Parametrien jälkeen -> ja sen jälkeen funktio
val nimi2 = { nimi: String -> nimi.uppercase() }
Funktioita
- Muunnos isoiksi kirjaimiksi
- return nimi.uppercase()
Jos (if), kun (when)
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
Teksti
- print
- print("teksti")
- println
- println("teksti")
- println(muuttujanimi)
- println("Muuttujan arvo on $muuttujanimi")
- println("Muuttujan arvo lisättynä viidellä on ${muuttujanimi + 5}") // voi olla myös val
Toisto
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
- // kommentti
Muuttujat
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
- 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
List
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
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
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
- 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
Valmiita luokkia Kotlinissa.
- data class Luokkanimi(val nimi: String, var nimi2: Int)
Null
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 Studio
Sovellus, jossa voidaan tehdä Android-sovelluksia.
Tiedostojärjestelmä
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
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.
Android
- enableEdgeToEdge() // sovellus täyttää koko näytön