Android開発ではじめるKotlin

  • 59
    いいね
  • 0
    コメント

導入 ~Kotlinを入れる~

Kotlinを使うにはやはりインストールが必要になります。
ですが、KotlinはAndroidStudioを手軽に使えるように出来ます

手順

AndroidStudio上から

Preference->Plugins->Install JetBrain Plugins

と進み、左上の検索ボックスに"kotlin"と打ち込むと関連する項目が出てきます
その中から Kotlin を選択し、右側の Install Plguin を選択することでインストール出来ます

最後にAndroidStudioを再起動することで使えるようになります

Android ProjectにKotlinを組み込む

Kotlinをインストールしたし、使えるようになっ・・・・・ってない
Android ProjectはデフォルトではJavaでビルドなどを行う設定になっています
そのためKotlinも仲間に加えるように設定しなければならないのです

手順

設定と言っても難しいものではありません
以下の通りにポチッとすれば大丈夫です

Tools->Kotlin->Configure Kotlin in Project

既存のJavaファイルをKotlinファイルに変換する

Kotlinを利用できる環境が整ったところで、JavaのソースコードをKotlinのソースコードに変換してみましょう
こちらもポチッとすると自動で変換してくれます

手順

Step.1

まずは、変換対象のJavaファイルを開いてください
以下はBlank Activityを開いた際のMainActivity.javaになります


import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // 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.
        int id = item.getItemId();

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

        return super.onOptionsItemSelected(item);
    }
}

Step2

Javaファイルを開いた状態で以下の操作を行います

Code->Convert Java File to Kotlin File

タブに表示されるファイル名の部分が.javaから.ktへ変わっていると思います
また、ソースコードも以下のようになりました
これであなたもKotlin使いです!
次は、Java/Kotlinで変わっている部分を少しずつ見ていきます


import android.os.Bundle
import android.support.design.widget.FloatingActionButton
import android.support.design.widget.Snackbar
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.Toolbar
import android.view.View
import android.view.Menu
import android.view.MenuItem

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)
    }
}

JavaとKotlinの違うところ

Kotlinにしたことでどう変わったのか実際に見ていきます

クラス周り

まずはクラス周りで変わった部分ですが、先にどう変わっているのか抜粋した部分から

public class MainActivity extends AppCompatActivity{ ... }
class MainActivity : AppCompatActivity(){ ... }

アクセス修飾子

Kotlinでは基本的にpublicとして扱われるため、変換したファイルでは無くなっています

継承

Javaではextendsキーワードを利用していましたが、Kotlinではコロン(:)を利用するようになっています

コンストラクタ

AppCompatActivity()という風に継承したクラスのコンストラクタを、継承したときに呼び出せるようになっています
もちろん引数有りのコンストラクタも書くことが出来ます

関数周り

次は関数に関してです

@Override
public boolean onOptionsItemSelected(MenuItem item){ ... }
override fun onCreateOptionsMenu(menu: Menu): Boolean { ... }

オーバーライド

アノテーションとして今までは記述をしていましたが、Kotlinでは関数宣言の先頭に書くようになりました

関数定義

Kotlinでは関数を定義する際にfunキーワードを利用するようになっています

引数と戻り値

引数も戻り値もそれぞれ名前の前で宣言する形から、コロン(:)を利用して後ろで宣言する形になりました

その他

FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show();
  }
});

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() }

valキーワード

これは変数の宣言をする際に使います
また、再代入が出来ない変数であることを示します
以下のコードは 2をaという変数に再代入するため エラーになります

val a = 1
a = 2

キャスト演算 as句

Javaではキャストを行うのに(型名)という形で利用していましたが、これでは括弧が増えて見づらくなってしまいます
それを解決するのがas句になります

型推論

皆さん変数を宣言する際にわざわざとってもとっても長いクラス名を何度もタイプするのは面倒ですよね?
例えばFloatingActionButtonとか・・・・

そういうのを楽にする機能がこの型推論になります

val fab = findViewById( R.id.fab ) as FloatingActionButton

代入演算子(=)の右側がFloatingActionButtonクラスであることは明白ですよね
そんなときには変数の宣言など明示的に型を書かなくても良くなります

無名関数(ラムダ関数)

Javaではボタンなどのリスナー登録に無名インターフェースを生成していたと思いますが、 さらに簡単に 扱えるようになりました

fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG).setAction("Action", null).show() }

コードを見るとかなりすっきりしていますね
{}ブロックが関数の中身になっています

"view"は実引数の部分であり、続いてアロー句を書いてそのあとに関数の中身を書くようになっています
無名インターフェースを書かなくて良くなった分コーディングに集中できます

また無名関数が受け取る引数が一つであれば、引数名と->を省略してitという名前で受け取って利用することができます

fab.setOnClickListener {
  Snackbar.make( it, "Replace with your own action", Snackbar.LENGTH_LONG ).setAction( "Action", null).show()
}