導入 ~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()
}