В этой статье рассматриваются методы, которые делают написание кода Android в Kotlin эффективным и простым. Kotlin — это язык общего назначения, который компилируется в байт-код Java, разработанный JetBrains, который создает IntelliJ IDE. Вы можете найти код для этой статьи на GitHub
Использование статического макета импорта в Kotlin
Одна из основных проблем работы с Android — это когда мы хотим использовать одно из представлений в упражнении. Мы должны использовать функцию ‘findViewById ()’, а затем набрать приведение к соответствующему типу представления. Kotlin использует другой подход: он позволяет импортировать все представления в файле макета. Например, предположим, что у нас есть файл макета, как показано ниже
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.kotlineffiecienttechniques.MainActivity2">
<TextView android:id="@+id/maintextview"
android:text="@string/hello_world"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</RelativeLayout>
И код активности, который обновляет текст maintextview с помощью статического импорта:
package com.kotlineffiecienttechniques
import android.support.v7.app.ActionBarActivity
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main_activity2.*
public class MainActivity2 : ActionBarActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main_activity2)
maintextview.text = "Hello Static Import!"
}
}
В приведенном выше коде, если вы видите, мы «статически импортировали» все представления, используя оператор импорта
import kotlinx.android.synthetic.main.activity_main_activity2.*
Сделав это, вы можете изменить текстовое представление следующим образом:
maintextview.text = "Hello Static Import!"
Чтобы скомпилировать приведенный выше код, вам нужно добавить следующее в зависимости вашего build.gradle
dependencies {
compile 'org.jetbrains.anko:anko-sdk21:0.9' // sdk19, sdk21, sdk23 are also available
compile 'org.jetbrains.anko:anko-support-v4:0.9' // In case you need support-v4 bindings
compile 'org.jetbrains.anko:anko-appcompat-v7:0.9' // For appcompat-v7 bindings
}
Примените плагин:
apply plugin: 'kotlin-android-extensions'
И добавьте следующее в buildscript :: dependencies
dependencies {
classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
}
С учетом вышеуказанных изменений, если вы создадите и запустите приложение, вы увидите активность, показанную ниже
Создание классов POJO в Котлине
Во многих приложениях, когда мы хотим преобразовать JSON / XML в объекты. Для этого нам нужны классы, которые содержат данные JSON / XML, когда вы используете сервисы REST. Определение таких объектов (также известный как POJO в Java) более удобно в Kotlin. Предположим, вы хотите определить POJO в Java для представления книги, код которой будет выглядеть следующим образом
public class Book {
private String ISBN;
private float price;
private int quantity;
private String title;
private String description;
public String getISBN() {
return ISBN;
}
public void setISBN(String ISBN) {
this.ISBN = ISBN;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
Тот же POJO с той же функциональностью, если мы хотим определить его в Kotlin, может быть определен следующим образом
public class Book {
public var ISBN: String = ""
public var price: Float = 0.toFloat()
public var quantity: Int = 0
public var title: String = ""
public var description: String = ""
}
Или, чтобы сделать его более кратким, его можно определить как класс данных следующим образом.
data class Book2(var ISBN: String, var price: Float, var quantity: Int,
var title: String , var description: String)
Это немного отличается от предыдущего POJO, поскольку у него есть основной конструктор. Все параметры должны быть переданы в конструктор при создании объекта. Когда мы определяем класс данных, он также добавляет методы «равно», «hashCode», «toString». Это должно быть предпочтительным способом определения POJO в Kotlin.
Как вы можете видеть выше POJO, который был определен в Java примерно в 50 строках кода. В Kotlin это может быть сделано в 7 строк или в 2 строки с использованием классов данных.
Конструкторы и Наследование в Котлине
Kotlin облегчает написание конструкторов для ваших классов. Первичный конструктор становится частью заголовка класса. Это следует после названия класса. Итак, предположим, что у нас есть первичный конструктор для нашего класса Book, код будет выглядеть следующим образом
public class Book (var ISBN: String, var price: Float, var quantity: Int,
var title: String , var description: String){
}
Приведенный выше код определяет основной конструктор, в который мы передаем значения. Члены инициализируются значениями.
Теперь создать объект класса Book будет следующим
val book1 = Book("123456", 43.0f, 4, "Kotlin for you", "Book on Kotlin")
Это удаляет стандартный код написания отдельной функции конструктора. Конструктор, который просто копирует переданные параметры в переменные-члены. Написание такого конструктора было бы необходимо, если бы вы использовали Java для написания своего приложения для Android.
Наследование в Kotlin также более безопасно; все классы Kotlin не могут быть расширены, если они не определены как open
Так что если вы хотите расширить Book
open public class Book (var ISBN: String, var price: Float, var quantity: Int,
var title: String , var description: String){
open fun getShippingPrice():Float {
return price;
}
}
Предположим, у нас есть подкласс HardCoverBook
Book
getShippingPrice
Код для этого будет следующим:
class HardCoverBook(ISBN: String, price: Float, quantity: Int,
title: String , description: String) :
Book(ISBN, price, quantity, title, description) {
override fun getShippingPrice():Float {
return price + 3.0f;
}
}
Использование лямбда-функций в Котлине
В Android у нас часто есть функции, которые принимают один интерфейс в качестве параметра. В таких случаях удобно использовать лямбда-функции Котлина. Посмотрите, как мы можем установить onClickListner
maintextview.setOnClickListener({ view -> Toast.makeText(this, "Showing Toast", Toast.LENGTH_SHORT).show(); })
Это всего лишь одна строка. Нам даже не нужно указывать тип представления параметров, поскольку оно может быть выведено статически. Эквивалентный код в Java будет
maintextview.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(this, "Showing Toast", Toast.LENGTH_SHORT).show();
}
});
Если мы запустим программу, установив onClickListener
Вывод.
Выше приведено несколько примеров, которые помогают написать краткий код на Kotlin для Android. Kotlin — новый язык, но поддерживается Jetbrains и имеет хороший потенциал. Размер apk увеличивается при использовании Kotlin, а не Java для вашей программы Android. Но вы можете быстрее разрабатывать код. Так что получайте удовольствие от написания своего следующего приложения для Android на Kotlin.