
Android Developers > スタートガイド > Kotlin と Android をゼロから学ぶ > Unit1 – Kotlin を用いた Android の基本 >Unit1-4 第2回 の内容をまとめたものです(翻訳ではありません)。また、一部関連した内容を追加しました
Unit1 – 4 の 第2回

第2回の内容は以下の通りです
- 第1回のKotlinコード(乱数を発生させる)を組み込んだAndroidアプリを作ります
- ボタンを押したら結果がテキストで表示されるようにします
- アプリのUI画面は Android Studio の Layout Editor で作成し、ボタンを押したときの動作は Kotlin で記述します
具体的には次のようなレッスンです
activity_main.xml
を開いてアプリにButton
(ボタンのView
)を追加しますMainActivity.kt
を開いてButton
をタップしたときの動作を記述しますToast
(Androidのポップアップメッセージ)を使います- アプリからKotlinコードで
TextView
を書き換えます
Layout Editor でUI画面を作成する
まず Layout Editor を使ってアプリの画面を作成してみますね
- Android Studio で新規にプロジェクトを作成します
- アプリの名前(Name)は “Dice Roller”
- 使用言語(Language)は Kotlin
- APIレベル(Minimum SDK)は 19 (KitKat)
- テンプレートは Empty Activity
- Project で
activity_main.xml (app > res > layout > activity_main.xml)
をダブルクリックすると Layout Editor が開きます - あらかじめ “Hello World” を表示する
TextView
が作られているので、その下に Pallet からButton
をドロップします。これらのView
部品はConstraintLayout
(ViewGroup
にあるレイアウトのひとつ)に配置されます ViewGroup
に配置されたView
は親子関係(ViewGroup
が親、View
が子)にあります
つづいて Button
と TextView
の配置やスタイルを修正するんですね
うん、constraint(制約)が大切なの。かならず縦方向、横方向それぞれに設定してね
Button
の配置とスタイルを修正- Design view で
Button
に constraint(制約)を設定します
Button
に表示されるテキスト(text)を “Roll” に変更します- Component Tree の
Button
にあるオレンジの!をクリックして Fix ボタンを押します。ハードコードされている文字列を、文字列リソースstrings.xml
を使うように修正します
- Design view で
TextView
のスタイルを修正- Design view で
TextView
を選択して、Attributes にある textSize を 36sp に変更します - Attributes の Common Attributes セクションにある text 項目を空に、ツールアイコン(スパナ)のついた text に 1 を設定します
- ツールアイコンのついた text 項目(tools text)は Android Studio の Design view でのみ text の代わりに表示されます。UIデザイン作成中の表示サンプルです
- Design view で
Activity の理解と import の自動化
Android の画面は Activity として管理されているんですね
- Android Studio でプロジェクトを作成するとまず MainActivity という Activity が最初に作成されます
- MainActivity を開く・・・Project で
MainActivity.kt
ファイルを開く(app > java > com.example.diceroller > MainActivity.kt)
package com.example.diceroller
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
- Kotlinは通常
main()
から処理を始めます。しかし Android の Kotlin は MainActivity のonCreate()
メソッドから処理を始めるようになっています
Android Studio を使うとKotlinコードへの import
の記述を自動化できます
- 表示されたソースコードで
import ...
となっている部分は...
をクリックして展開(表示)できます - Androidには膨大なクラスが用意されていて、これらを使ってアプリを作成します
- クラスを使うには
import
を使ってクラスのある場所をあらかじめ特定しておく必要があります - たとえば
Button
があるのはandroid.widget.Button
なので、これをimport
で宣言しておきます
- クラスを使うには
- 使用するクラスがどこにあるか把握して、それをいちいち
import
宣言して書いておくのは大変な作業です - Android Studio には、書いているプログラムで使っているクラスを判別して
import
宣言の内容を自動で書き換えてくれる機能があります。使わなくなったクラスのimport
宣言を自動で削除することも可能です
import
の自動設定を有効にしますね
- Android Studio で Preferences for New Projects を開きます(File > New Project Settings > Preferences for New Projects)
- 開いたウィンドウで Other Settings > Auto Import と展開します
- Java セクション と Kotlin セクションにある Add unambiguous imports on the fly(追加機能)と Optimize imports on the fly (for current project)(削除機能)にチェックを入れます
- OK ボタンを押す
自動 import
がうまく動作しなかったときはクラス名が赤で反転表示されます。クラス名の上にカーソルを移動して Alt+Enter で修正してくださいね
ボタンに機能を割り当てる
ボタンをクリックすると Toast
がポップアップするアプリを作成しますね
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
val toast = Toast.makeText(this, "Dice Rolled!", Toast.LENGTH_SHORT)
toast.show()
}
}
}
ボタンを作成してKotlinで扱えるようにします
- Layout Editor で
Button
を作成し、これにbutton
というID(リソースID)を付けます Button
につけられたbutton
というリソースIDは、KotlinプログラムからR.id.button
として参照できますfindViewById(R.id.button)
は、KotlinプログラムがR.id.button
というリソースIDを持つオブジェクトへアクセスするための参照を返しますval rollButton: Button = findViewById(R.id.button)
・・・Button
型の変数rollButton
にオブジェクトへの参照を代入します。rollButton
をインスタンスとしてUIのbutton
を操作できるようになります
ボタンに click listener を設定します
- ボタンがクリックされたことを検知する機能は click listener です
- click listener を、クリックされたことを検知したい
View
部品に設定します部品のオブジェクト.setOnClickListener { 処理内容 }
setOnClickListener
を使って、ボタンがクリックされたことを検知するとともに、そのときに行う処理を書いておくことができます
Toast
でメッセージ表示ですね
val toast = Toast.makeText(this, "Dice Rolled!", Toast.LENGTH_SHORT)
・・・toast
オブジェクトの作成toast.show()
・・・toast
の表示をしますToast.makeText(this, "Dice Rolled!", Toast.LENGTH_SHORT).show()
・・・変数を使わずにインスタンスの生成と表示をまとめることもできます
Toast
のかわりに TextView
で表示するにはこんな感じですね
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
val resultTextView: TextView = findViewById(R.id.textView)
resultTextView.text = "6"
}
}
}
- Layout Editor を使って
activity_main.xml
にTextView
を作成し、リソースIDをtextView
と設定します MainActivity.kt
にfindViewByID(R.id.textView)
を使ってtextView
への参照を記述します- インスタンスの text プロパティに値を設定します
- このプログラムでは常に 6 を表示しています

KotlinコードでView
部品を操作するには、 findViewById
のかわりに View Binding を使うのがおすすめなんですね
- このチュートリアルの解説は
findViewByID
を使ったものなんですが、将来的にはfindViewByID
は View Binding に置き換わるそうです - View Binding を使うことで
findViewByID
を使わずにView
部品へ簡単にアクセスできるようになります - View Binding を使うには、Android Studio 3.6 以降(できれば 4.0 以降)を使います
- 詳しくは以下にまとめました
乱数を表示する
まず Dice
クラスを作成してみますね
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
val resultTextView: TextView = findViewById(R.id.textView)
resultTextView.text = "6"
}
}
}
class Dice(val numSides: Int) {
fun roll(): Int {
return (1..numSides).random()
}
}
Dice
クラスのコードを追加します- Android Studio上で、
Dice
クラスのnumSides
がグレーに反転しているとおもいます。カーソルをのせるとprivate
にしたほうがいいかもとアドバイスが出ます。ダイアログの Make ‘numSides’ ‘private’ をクリックしてprivate
に修正しておきます
つぎは setOnClickListener
の中身の書き換えですね
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
rollDice()
}
}
}
class Dice(val numSides: Int) {
fun roll(): Int {
return (1..numSides).random()
}
}
setOnClickListener
の内容をrollDice()
に変更します- すると警告が出る(出ないときは
rollDice
の上で Alt+Enter)ので More action… を選択します - リストが出るので Create function ‘rollDice()’ を選択
MainActivity
クラスの中にrollDice
関数のひな型が作られます
rollDice
関数のひな型が追加されるとこんな感じです
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
rollDice()
}
}
private fun rollDice() {
TODO("Not yet implemented")
}
}
class Dice(val numSides: Int) {
fun roll(): Int {
return (1..numSides).random()
}
}
rollDice
関数の内容を記述します
今回はこれで完成ですね
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
rollButton.setOnClickListener {
rollDice()
}
}
private fun rollDice() {
val dice = Dice(6)
val diceRoll = dice.roll()
val resultTextView: TextView = findViewById(R.id.textView)
resultTextView.text = diceRoll.toString()
}
}
class Dice(val numSides: Int) {
fun roll(): Int {
return (1..numSides).random()
}
}
見やすいコードの書き方
- Kotlinスタイルガイドを参考にします
- Android Studio にソースコードを自動で見やすく整形する機能があります
MainActivity.kt
を開いてすべてを選択(Ctrl+a)- Code > Reformat Code を実行
- 行をまとめてコンパクトにすると見やすくなります
- ちゃんとコメントを入れる( /* ~ */ , /** ~ */ , //)
この回のまとめ
- Androidアプリに
Button
を追加するには Layout Editor を使います - アプリに機能を加えたいときは
MainActivity.kt
に記述されたクラスを修正します - ちょっとした動作確認をするのに
Toast
は便利 - ボタンをクリックしたときの動作は
setOnClickListener()
メソッドを使ってボタンに追加します - アプリ実行時の画面更新は、レイアウトに使われている
View
部品のプロパティやメソッドを利用して行います - ソースコードは見やすく、コメントもちゃんと入れるとお行儀がいいです