Статьи

Техники Kotlin, которые улучшают ваш код Android

В этой статье рассматриваются методы, которые делают написание кода 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"
    }

С учетом вышеуказанных изменений, если вы создадите и запустите приложение, вы увидите активность, показанную ниже
Activity with Static imports

Создание классов 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;
    }
}

Предположим, у нас есть подкласс HardCoverBookBookgetShippingPrice Код для этого будет следующим:

 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
Activity with toast

Вывод.

Выше приведено несколько примеров, которые помогают написать краткий код на Kotlin для Android. Kotlin — новый язык, но поддерживается Jetbrains и имеет хороший потенциал. Размер apk увеличивается при использовании Kotlin, а не Java для вашей программы Android. Но вы можете быстрее разрабатывать код. Так что получайте удовольствие от написания своего следующего приложения для Android на Kotlin.