Slide 1

Slide 1 text

Ízelítő a Kotlin nyelvű Android fejlesztésből Braun Márton Szabolcs zsmb13 [email protected] zsmb13

Slide 2

Slide 2 text

Háttér • JetBrains  2010: fejlesztés kezdete  2016 február: Kotlin 1.0 • JVM nyelv  Java 6-os bytecode-ra fordul  100%-os együttműködés Java kóddal

Slide 3

Slide 3 text

• A megszokott környezetben használható • Android Studio plugin • 4 sor a Gradle build fájlokba  Kis méretű runtime és stdlib (<1 MB) • Fájlonként adoptálható  Új kód Kotlinban  Meglévő Java kód refaktorálása Használat

Slide 4

Slide 4 text

Kotlin gyorstalpaló

Slide 5

Slide 5 text

Változók // Java int x = 1; final int x = 1; // Kotlin var x: Int = 1 val x = 1

Slide 6

Slide 6 text

Függvények fun add(a: Int, b: Int): Int = a + b fun add(a: Int, b: Int): Int { return a + b } fun add(a: Int, b: Int) = a + b

Slide 7

Slide 7 text

Osztályok class Person(val name: String, var age: Int) { }

Slide 8

Slide 8 text

Az osztály Java megfelelője public class Person { private final String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

Slide 9

Slide 9 text

Data class class Person(val name: String, var age: Int) data

Slide 10

Slide 10 text

A data class Java megfelelője public class Person { private final String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } }

Slide 11

Slide 11 text

Data class - összefoglaló data class Person( val name: String, var age: Int) public class Person { private final String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (age != person.age) return false; return name != null ? name.equals(person.name) : person.name == null; } public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } }

Slide 12

Slide 12 text

Példák

Slide 13

Slide 13 text

Property hozzáférések data class Person(val name: String, var age: Int) // Kotlin val person = Person("Sam", 41) println(person.name) person.age = 42

Slide 14

Slide 14 text

Property hozzáférések data class Person(val name: String, var age: Int) // Java Person person = new Person("Sam", 41); System.out.println(person.getName()); person.setAge(42);

Slide 15

Slide 15 text

Property hozzáférések // Kotlin recyclerView.adapter = adapter recyclerView.isDrawingCacheEnabled = true recyclerView.drawingCacheQuality = QUALITY_HIGH // Java recyclerView.setAdapter(adapter); recyclerView.setDrawingCacheEnabled(true); recyclerView.setDrawingCacheQuality( ); QUALITY_HIGH

Slide 16

Slide 16 text

Kotlin Android Extensions // MainActivity.kt class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { ... btn0.setText(R.string.btn0_label) btn0.setOnClickListener(...) } } // activity_main.xml

Slide 17

Slide 17 text

Lambda kifejezések fun useNumber(number: Int, operation: (Int) -> Unit) { operation(number) } useNumber(5, { x -> println(x * 2) }) useNumber(5) { x -> println(x * 2) } useNumber(5) { println(it * 2) }

Slide 18

Slide 18 text

SAM conversion public interface OnClickListener { void onClick(View v); }

Slide 19

Slide 19 text

SAM conversion btnLogin.setOnClickListener( object : View.OnClickListener { override fun onClick(v: View) { presenter.startLogin() } } )

Slide 20

Slide 20 text

SAM conversion btnLogin.setOnClickListener { presenter.startLogin() } btnLogin.setOnClickListener( object : View.OnClickListener { override fun onClick(v: View) { presenter.startLogin() } } )

Slide 21

Slide 21 text

button.setVisibility(View.GONE) Extension function button.visibility = View.GONE button.hide() fun View.hide() { this.visibility = View.GONE }

Slide 22

Slide 22 text

Lambda + extension function fun useRandom(actions: Random.() -> Unit) { val random = Random() random.actions() } useRandom { this.nextInt() nextDouble() }

Slide 23

Slide 23 text

Deklaratív hierarchia leírás

Slide 24

Slide 24 text

Imperatív hierarchia építés LinearLayout linearLayout = new LinearLayout(this); EditText editText = new EditText(this); Button button = new Button(this); button.setOnClickListener(...); linearLayout.addView(editText); linearLayout.addView(button); setContentView(linearLayout);

Slide 25

Slide 25 text

Anko View DSL override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) verticalLayout { val name = editText() button("Say Hello") { onClick { toast("Hello, ${name.text}!") } } } } https://github.com/Kotlin/anko

Slide 26

Slide 26 text

Anko View DSL

Slide 27

Slide 27 text

MaterialDrawer https://github.com/mikepenz/MaterialDrawer

Slide 28

Slide 28 text

MaterialDrawerKt drawer { closeOnClick = true primaryItem("Home") { icon = R.drawable.ic_home } primaryItem("Settings") { icon = R.drawable.ic_settings } } https://github.com/zsmb13/MaterialDrawerKt

Slide 29

Slide 29 text

Levezetés

Slide 30

Slide 30 text

• JVM  Android  Desktop  Szerver • Gradle Script Kotlin • JavaScript (1.1 óta stabil)  Kliens oldal  Szerver oldal • (Native) Több, mint egy “jobb Java” android { buildToolsVersion("25.0.0") compileSdkVersion(23) defaultConfig { minSdkVersion(15) targetSdkVersion(23) applicationId = "com.ex.app" versionCode = 1 versionName = "1.0" } }

Slide 31

Slide 31 text

• kotlinlang.org Merre tovább?

Slide 32

Slide 32 text

Merre tovább? • Kotlin – Ready for Production (Hadi Hariri)  https://youtu.be/R0J_Jl7bKY8 • Android Development with Kotlin (Jake Wharton)  https://youtu.be/A2LukgT2mKc • Kotlin in Production (Christina Lee)  https://youtu.be/mDpnc45WwlI • 10 Kotlin Tricks in 10(ish) Minutes (Jake Wharton)  https://youtu.be/YKzUbeUtTak

Slide 33

Slide 33 text

Merre tovább? • Using Project Kotlin for Android (Jake Wharton)  https://docs.google.com/document/d/1ReS3ep- hjxWA8kZi0YqDbEhCqTt29hG8P44aA9W0DM8/preview • Why you should totally switch to Kotlin (Magnus Vinther)  https://medium.com/@magnus.chatt/why-you-should-totally- switch-to-kotlin-c7bbde9e10d5 • What do 17 Google Developers Experts for Android think about Kotlin? (Antonio Leiva)  https://antonioleiva.com/google-kotlin/

Slide 34

Slide 34 text

Merre tovább? • Kotlin on Android. Now official (JetBrains, Kotlin Blog)  https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android- now-official/ • Kotlin and Android | Android Developers  https://developer.android.com/kotlin/index.html • Kotlin on Android FAQ (Google)  https://developer.android.com/kotlin/faq.html

Slide 35

Slide 35 text

Merre tovább? • Introduction to Kotlin (Hadi Hariri, Andrey Breslav)  Péntek (május 19.), 19:30-20:30 • Life is great and everything will be ok, Kotlin is here (Christina Lee, Jake Wharton)  Péntek (május 19.), 23:30-00:30

Slide 36

Slide 36 text

Amire nem jutott idő… • Null safety • Collection manipulations • Inline and infix functions • Named and default parameters • Sealed class, when expression • Declaration site variance • Destructuring declarations • Operator overloading • Delegation • String templates • Sequences • Singletons • Coroutines • …

Slide 37

Slide 37 text

Köszönöm a figyelmet! zsmb13 [email protected] zsmb13 Fotó: Alexey Sergeev