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

初めてのAndroidアプリ開発(Kotlin編)- プログラミングの基本

More than 1 year has passed since last update.

初めてのAndroidアプリ開発(Kotlin編)- プログラミングの基本

by TomiGie
1 / 33

こちらの資料は、東北Tech道場の参加者向けに作成したハンズオン資料
初めてのAndroidアプリ開発ープログラミングの基本
を参考にした、Kotlin編の資料となります。


JavaでAndroidの開発をしているが、最近Kotlinが気になっていて使ってみたいけれども、
実際にどうやって開発をするんだろう?
という方を想定してこの資料を作成しました。

この2つの資料を見比べながら、JavaとKotlinでの書き方の違いを理解して頂けると幸いです


※ 本資料作成時は Android Studio の最新バージョンが2.3.3のため、Kotlinのプラグインのインストールから説明をしていきます。
(Android Studio 3.0からはプラグインがプリインストールされるため、プラグインのインストール作業が不要となると思います)


プログラミングの基本要素

  • 変数
  • 分岐
  • ループ

前準備(Kotlin)


新規プロジェクト作成

AndroidStudioでプロジェクトを作成します。
スクリーンショット 2017-08-30 14.42.22.png

Add an Activity to Mobile の画面では"Empty Activity"を選択します。
スクリーンショット 2017-08-30 14.42.47.png

プロジェクトが生成されましたがこの時点ではまだJavaのプロジェクトです。
スクリーンショット 2017-08-30 14.43.49.png


Android Studio に Kotlinプラグインをインストールする


Android Studio 2.3.3でKotlinを使うには、Kotlinのプラグインが必要なため、
まずはKotlinのプラグインをインストールします。

AndroidStudioメニュー > Preferencesを選択
スクリーンショット 2017-08-30 14.44.27.png

plugins > Install JetBlains plugin を選択
スクリーンショット 2017-08-30 14.46.06.png

一覧からKotlinを選択 > Install をクリック
スクリーンショット 2017-08-30 14.46.46.png

インストールが完了したら、Android Studio を一度再起動します。
再起動したら、プラグインのインストールが完了です。


プロジェクトをKotlin用にセッティング

プラグインをインストールしただけではまだKotlinは使えません。
プロジェクトをKotlin用にセッティングすることでKotlinが使えるようになるのです。


build.gradle にKotlin用の記述を追加する

Kotlinでビルドできるように build.gradleを変更します。

Android Studioメニューから
Tools > Kotlin > Configure Kotlin Project を選択

スクリーンショット 2017-08-31 13.31.13.png

次に出て来るウィンドウで
Android with Gradle を選択

スクリーンショット 2017-08-31 13.31.50.png

次のウィンドウでKotlinのバージョンを設定。
特に指定がなければ最新バージョンを選択する。
スクリーンショット 2017-08-31 13.32.01.png

OKを選択すると build.gradle にKotlin用の設定が自動で追加され、この画面に切り替わるので、最後に Sync Now をクリックします。

スクリーンショット 2017-08-31 13.32.17.png


app/build.gradle に extentions ライブラリを追加

app/build.gradle に
apply plugin: 'kotlin-android-extensions'
を1行追加し、 Sync Now を選択します。

スクリーンショット 2017-08-31 14.38.35.png

この extentions ライブラリは、今までJavaで行っていたFindViewById()を使わず、直接Viewのidを指定して、テキストの設定等ができる便利なライブラリです(詳しい使い方は後ほど説明します)。

Sync Now が無事に終われば build.gradle の設定は完了です。


JavaのソースコードをKotlinに変換する


変換するJavaファイル(ここでは MainActivity.java)を表示します

スクリーンショット 2017-08-31 13.42.44.png


JavaファイルをKotlinに変換

Android Studio メニューの
Code > Convert Java File to Kotlin File を選択します

スクリーンショット 2017-08-31 13.42.02.png

変換が完了すると、このようにJavaがKotlinに変換されます

スクリーンショット 2017-08-31 13.42.26.png


前準備(xml)

レイアウトの編集

ここでは activity_main.xml を編集します。

まず、 android:id="@+id/textview"の部分を追加します。

activity_main.xml
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootLayout"
    tools:context="org.tohokutechdojo.test.sleeping.MainActivity">

    <TextView 
        android:id="@+id/textview"
        android:text="hello world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</android.support.constraint.ConstraintLayout>

変数

計算結果や文字列などを入れておくための箱
String, int, float などがあります。
Kotlinで変数を宣言する際は varvalを使って宣言します。


変数を使ってみる

//追加 の行を入力しましょう。

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var greeting = "こんにちは" //追加
        textview.text = greeting   //追加
    }
}

String型

Java編では
String greeting = "こんにちは"
という風にString型を宣言していました。

これをKotlinで書くと、
val greeting: String = "こんにちは"
となります。

また、Kotlinは自動的に代入される型を推論してくれるので、
val greeting = "こんにちは"
と書くことも出来ます。


TextView型

Androidで画面に文字を表示する際はTextView という型(クラス)を使います。

前準備のところでレイアウト中のTextViewに
android:id="@+id/textview"
とIDを割り振っておいたのはここで使うためです。

Javaでは、このViewのIDを使ってテキストをセットする場合、
TextView textView = (TextView) findViewById(R.id.textview)
textView.setText("こんにちは");

となりますが、Kotlinでは
textview.text = "こんにちは"
この割り振ったViewのidを直接指定して、テキストの設定等を行うことができます。


分岐

if (条件式){
    …
} else {    
    …
}

時間で挨拶を変えてみる

  • 0時から12時
    • おはよう
  • 12時から16時
    • こんにちは
  • 17時から24時
    • こんばんは

現在時刻を取得して分岐させる

//追加 の行を入力しましょう。

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var greeting = "こんにちは"
        val trialTime = Date()                         //追加
        val calendar = GregorianCalendar()             //追加
        calendar.time = trialTime                      //追加

        val hour = calendar.get(Calendar.HOUR_OF_DAY)  //追加
        if (hour in 1..11) {                           //追加
            greeting = "おはよう"                       //追加
        } else if (15 < hour) {                        //追加
            greeting = "こんばんは"                     //追加
        }                                              //追加

        textview.text = greeting
    }
}

入力したら実行してみましょう。


これから作るアプリ

羊の数を数える睡眠誘導アプリを作ります


羊を3匹数えてみる

//追加 の行を入力しましょう

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var greeting = "こんにちは"
        val trialTime = Date()
        val calendar = GregorianCalendar()
        calendar.time = trialTime

        val hour = calendar.get(Calendar.HOUR_OF_DAY)
        if (hour in 1..11) {
            greeting = "おはよう"
        } else if (hour > 15) {
            greeting = "こんばんは"
        }
        greeting += "。。。ひつじが1匹。。。ひつじが2匹。。。ひつじが3匹。。。" //追加

        textview.text = greeting
    }
}

入力したら実行してみましょう。


眠れるまで何十回も書くのか?


ループ(繰り返し処理)

ひつじが1匹
ひつじが2匹
ひつじが3匹
ひつじが4匹
ひつじが5匹
.
.
.


forループ

for (i in 1..10) {

}

i --- カウンタ
in 1..10 --- 1〜10までの範囲でカウンタを増やす条件式


for ループでやってみる

//追加 行を入力しましょう。

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var greeting = "こんにちは"
        val trialTime = Date()
        val calendar = GregorianCalendar()
        calendar.time = trialTime

        val hour = calendar.get(Calendar.HOUR_OF_DAY)
        if (hour in 1..11) {
            greeting = "おはよう"
        } else if (hour > 15) {
            greeting = "こんばんは"
        }

        val sheepNum = 10                          //追加
        for (i in 1..sheepNum) {                   //追加
            greeting += "。。。ひつじが" + i + "匹"     //追加
        }                                          //追加

        textview.text = greeting
    }
}

入力したら実行してみましょう。


もっとインタラクティブに

画面をタップするとカウントするように


前準備

レイアウトXMLを編集

android:id="@+id/rootLayout"の部分を追加します。

activity_main.xml
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootLayout"
    tools:context="org.tohokutechdojo.test.sleeping.MainActivity">

    <TextView android:id="@+id/textview"
        android:text="@string/hello_world" 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</android.support.constraint.ConstraintLayout>

タップ処理の実装

//追加 の行を入力、//削除 の行を削除しましょう

MainActivity.kt
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*


class MainActivity : AppCompatActivity() {
    var sheepCount = 0 // 追加

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        var greeting = "こんにちは"
        val trialTime = Date()
        val calendar = GregorianCalendar()
        calendar.time = trialTime

        val hour = calendar.get(Calendar.HOUR_OF_DAY)
        if (hour in 1..11) {
            greeting = "おはよう"
        } else if (hour > 15) {
            greeting = "こんばんは"
        }

//        val sheepNum = 10                          //削除
//        for (i in 1..sheepNum) {                   //削除
//            greeting += "。。。ひつじが" + i + "匹"     //削除
//        }                                          //削除

        greeting += "ねむれませんか?"                  //追加

        textview.text = greeting

        rootLayout.setOnClickListener {             //追加
            sheepCount++                            //追加
            val sheepText = "ひつじが$sheepCount 匹"  //追加
            textview.text = sheepText               //追加
        }                                           //追加
    }
}

入力したら実行してみましょう。


文字の連結

Kotlinでは、String型の文字にInt型の値や変数を連結する際は
val sheepText = "ひつじが$1匹"
val sheepText = "ひつじが$sheepCount 匹"
という風に$を使って連結する事が可能です。

[補足]
あるクラスの値を連結したい場合は
val sheepText = "ひつじが${sheep.count}匹"
という感じで${}を使うと連結が出来ます。

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした