A Taste of Kotlin on Android (Google I/O Extended 2017 Budapest)

A Taste of Kotlin on Android (Google I/O Extended 2017 Budapest)

An introductory talk on Kotlin prepared right before Google made it an official language on Android. A brief history of where the language comes from, what benefits it offers, and many examples of its syntax and features.

Talk recording (Hungarian): https://youtu.be/cRyi5crJRDU?t=31m33s

4047c64e3a1e2f81addd4ba675ddc451?s=128

Marton Braun

May 18, 2017
Tweet

Transcript

  1. Ízelítő a Kotlin nyelvű Android fejlesztésből Braun Márton Szabolcs zsmb13

    zsmb13@sch.bme.hu zsmb13
  2. 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
  3. • 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
  4. Kotlin gyorstalpaló

  5. Változók // Java int x = 1; final int x

    = 1; // Kotlin var x: Int = 1 val x = 1
  6. 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
  7. Osztályok class Person(val name: String, var age: Int) { }

  8. 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; } }
  9. Data class class Person(val name: String, var age: Int) data

  10. 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; } }
  11. 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; } }
  12. Példák

  13. 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
  14. 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);
  15. 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
  16. Kotlin Android Extensions // MainActivity.kt class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) { ... btn0.setText(R.string.btn0_label) btn0.setOnClickListener(...) } } // activity_main.xml <Button android:id="@+id/btn0" />
  17. 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) }
  18. SAM conversion public interface OnClickListener { void onClick(View v); }

  19. SAM conversion btnLogin.setOnClickListener( object : View.OnClickListener { override fun onClick(v:

    View) { presenter.startLogin() } } )
  20. SAM conversion btnLogin.setOnClickListener { presenter.startLogin() } btnLogin.setOnClickListener( object : View.OnClickListener

    { override fun onClick(v: View) { presenter.startLogin() } } )
  21. button.setVisibility(View.GONE) Extension function button.visibility = View.GONE button.hide() fun View.hide() {

    this.visibility = View.GONE }
  22. Lambda + extension function fun useRandom(actions: Random.() -> Unit) {

    val random = Random() random.actions() } useRandom { this.nextInt() nextDouble() }
  23. <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:layout_width="wrap_content"

    android:layout_height="wrap_content" /> </LinearLayout> Deklaratív hierarchia leírás
  24. 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);
  25. 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
  26. Anko View DSL

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

  28. MaterialDrawerKt drawer { closeOnClick = true primaryItem("Home") { icon =

    R.drawable.ic_home } primaryItem("Settings") { icon = R.drawable.ic_settings } } https://github.com/zsmb13/MaterialDrawerKt
  29. Levezetés

  30. • 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" } }
  31. • kotlinlang.org Merre tovább?

  32. 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
  33. 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/
  34. 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
  35. 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
  36. 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 • …
  37. Köszönöm a figyelmet! zsmb13 zsmb13@sch.bme.hu zsmb13 Fotó: Alexey Sergeev