Help us understand the problem. What is going on with this article?

KotlinでAndroid

More than 3 years have passed since last update.

Androidを開発しているとJava6的な冗長というかめんどくさいというか、融通がきかないというかで、いらいらしてしまいます。Kotlinがいいよ!という噂を聞いたので試してみました。(あんまり色々試せなかったのでアップデートできたらいいな・・)

環境

試した環境は以下のとおりです

  • OSX Yosemite(10.10.5)
  • Android Studio 1.5
  • Android SDK 24.4.1
  • JDK 1.8

Android StudioにKotlinプラグインのインストール

まずはAndroid StudioにKotlinプラグインをインストールし、Kotlinの開発環境を整えます
1. [Preference]から[Plugins]を選択し、「Install JetBrain plugin...」をクリックします
plugin1.png
2. 「Browse JetBrains Plugins」画面で"kotlin"を検索すると、"Kotlin"プラグインが表示されます。「Install plugin」ボタンをクリックしてプラグインをインストールします
plugin2.png
3. ダウンロードとインストールの確認ダイアログが表示されるので、「Yes」ボタンをクリックします
plugin3.png
4. ダウンロードが開始されます
plugin4.png
5. ダウンロードが完了するとダイアログが閉じるので、「Restart Android Studio」ボタンをクリックしてAndroid Studioを再起動します
plugin5.png
6. 再起動の確認ダイアログが表示されるので、「Restart」ボタンをクリックしてAndroid Stusioを再起動します
plugin6.png

サンプルプロジェクト作成

サンプルプロジェクトを作成します。通常のAndroidアプリ作成と同じ手順で作成し、Kotlinファイルに変換します。
1. Start a new Android Studio projectから、"BlankActivity"を作成します
2. [Code]-[Convert Java File to kotlin File]を選択すると、JavaがKotlinに変換されます。
変換されたコードは以下のようになります

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar = findViewById(R.id.toolbar) as Toolbar
        setSupportActionBar(toolbar)

        val fab = findViewById(R.id.fab) as FloatingActionButton
        fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show() }
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
        // Inflate the menu; this adds items to the action bar if it is present.
        menuInflater.inflate(R.menu.menu_main, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        val id = item.itemId

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true
        }

        return super.onOptionsItemSelected(item)
    }
}

環境をKotlinに

  1. ソースコードを配置するディレクトリ名を"java"から"kotlin"に変更します。"java"ディレクトリを選択し、右クリックから[Refactor]-[Rename...]を選択します(Testコードのパッケージもリネームします) rename.png
  2. Projectを見ると、以下の様な構成になっています rename4.png
  3. [Tool]-[Kotlin]-[Configure Kotlin Project]を選択し、プロジェクトの構成をKotlinにあわせます rename5.png
  4. 確認ダイアログが表示されます。バージョンはデフォルトのまま「OK」ボタンをクリックします ConfigureKotlin.png
  5. build.gradleが変更されます。同期するようメッセージが表示されるの、"Sync Now"のリンクをクリックして変更を同期します Sync.png

変更前のbuild.gradle(Module: app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "jp.co.opst.kotlinsample"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

変更後のbuild.gradle(Module: app)

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "jp.co.opst.kotlinsample"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
buildscript {
    ext.kotlin_version = '1.0.0-beta-3595'
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
repositories {
    mavenCentral()
}

依存関係を追加したり、ビルド時のクラスパスなどが追加されています。

サンプルアプリの実行

普通にアプリケーションを実行します。
うごいた!
実行結果1.png

Kotlinっぽいコードを試してみる

エバンジェリストさんの資料を拝見して、色々試したかったけど時間がないので拡張関数だけ試してみます
エバンジェリスト直伝!Kotlinを既存プロダクトで使う #jjug_ccc #jjug #jkug // Speaker Deck

拡張関数を試す

  1. 新しいKotlin Fileを作成します newfile.png
  2. 任意のファイル名を入力して「OK」ボタンをクリックします newfile2.png
  3. 関数を定義して、アプリケーション起動時に呼び出してみます
SampleKotlin.kt
package jp.co.opst.kotlinsample

import android.content.Context
import android.widget.Toast

fun Context.toast(message: String, duration:Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, message, duration).show()
}
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
         // (省略)
        toast("Hello, Kotlin!")
    }

アプリケーションを起動するとトーストが表示されました!
hello,kotlin!.png

miyatay
opst
情報技術と社員力でお客様を成功に導く Make IT Your Success
https://www.opst.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away