一覧
状態:確認中
閲覧数:1,710
投稿日:2018-04-26
更新日:2018-05-19
内容
新規Kotlinプロジェクト作成
レイアウト編集
現在時刻を取得後、if文で条件分岐
for ループ
画面をタップするとカウント
画像を表示
2枚の画像をタップする度に切り替えてアニメーション
音声ファイルを組み込む
スリープから回復してきた時に呼び出される処理を追加
アプリが終了しても値を残す
レイアウト編集
activity_main.xml を編集
android:id="@+id/textview1"を追加
▼activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<TextView
android:id="@+id/textview1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
kotlin-stdlib-jre7 is deprecated. Please use kotlin-stdlib-jdk7 instead
Unresolved reference: textview
解決方法
案A.「MainActivity.kt」に「import kotlinx.android.synthetic.main.activity_main.*」を追加
▼MainActivity.kt
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
案B.従来の手法で記述
▼MainActivity.kt
//textview.text = greeting //追加
findViewById<TextView>(R.id.textview).text = greeting
案A.「MainActivity.kt」に「import kotlinx.android.synthetic.main.activity_main.*」を追加
▼work/w4c/android0/introducesleep20180426/MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var greeting = "こんにちは" //追加
textview.text = greeting //追加
//findViewById<TextView>(R.id.textview).text = greeting
}
}
案B.従来の手法で記述
▼work/w4c/android0/introducesleep20180426/MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
//import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var greeting = "こんにちは" //追加
//textview.text = greeting //追加
findViewById<TextView>(R.id.textview).text = greeting
}
}
・Unresolved reference: textview
現在時刻を取得後、if文で条件分岐
コード
▼MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
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 //追加
//findViewById<TextView>(R.id.textview).text = greeting
}
}
for ループ
コード
▼MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
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 = "こんばんは"
}
//greeting += "。。。ひつじが1匹。。。ひつじが2匹。。。ひつじが3匹。。。"
val sheepNum = 10 //追加
for (i in 1..sheepNum) { //追加
greeting += "。。。ひつじが" + i + "匹" //追加
} //追加
textview.text = greeting
//findViewById<TextView>(R.id.textview).text = greeting
}
}
画面をタップするとカウント
コード
▼MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
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 (15 < hour) {
greeting = "こんばんは"
}
//greeting += "。。。ひつじが1匹。。。ひつじが2匹。。。ひつじが3匹。。。"
//val sheepNum = 10
//for (i in 1..sheepNum) {
// greeting += "。。。ひつじが" + i + "匹"
//}
greeting += "ねむれませんか?" //追加
textview.text = greeting
//findViewById<TextView>(R.id.textview).text = greeting
rootLayout.setOnClickListener { //追加
sheepCount++ //追加
val sheepText = "ひつじが$sheepCount 匹" //追加
textview.text = sheepText //追加
} //追加
}
}
・初めてのAndroidアプリ開発(Kotlin編)
画像を表示
コード
▼layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/sheep_1" />
</android.support.constraint.ConstraintLayout>
2枚の画像をタップする度に切り替えてアニメーション
表示切り替え
sheepCount % 2
・羊を数えた回数を2で割った余りを求めている
0 ->
・余りが0(偶数)の時
・1枚めの羊の絵(sheep_1)をimageView1にセット
else ->
・余りが0以外(奇数)の時
・2枚めの羊の絵(sheep_2)をimageView1にセット
コード
▼MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
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 (15 < hour) {
greeting = "こんばんは"
}
//greeting += "。。。ひつじが1匹。。。ひつじが2匹。。。ひつじが3匹。。。"
//val sheepNum = 10
//for (i in 1..sheepNum) {
// greeting += "。。。ひつじが" + i + "匹"
//}
greeting += "ねむれませんか?"
textview.text = greeting
//findViewById<TextView>(R.id.textview).text = greeting
rootLayout.setOnClickListener {
sheepCount++
val sheepText = "ひつじが$sheepCount 匹"
textview.text = sheepText
when(sheepCount % 2) {
0 -> imageView1.setImageResource(R.drawable.sheep_1) // 追加
else -> imageView1.setImageResource(R.drawable.sheep_2) // 追加
}
}
}
}
音声ファイルを組み込む
プロジェクトファイルに音声ファイルを組み込む
rawという名前のフォルダを作成
・res で右クリック ⇒ New ⇒ Android Resource Directory
・開いたダイアログで、Resource Type から raw を選択してrawという名前のフォルダを作成
・この raw の中に音声ファイルをpaste
変数の型の後ろに?を付けて MediaPlayer? としている理由
var mp: MediaPlayer? = null
・?を付けることでnull許容型(nullを代入できる型)として宣言をし、nullを代入するため・?を付けずにnullを代入しようとすると、Kotlinではエラーになる
音声の再生
・MediaPlayerオブジェクトのstart()メソッドを呼び出すことで音声の再生を開始
・mpの後ろに?を付けてmp?とすることで、mpがnullで無ければmp.start()を実行するという意味になる
▼MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.media.MediaPlayer
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
class MainActivity : AppCompatActivity() {
var sheepCount = 0
var mp: MediaPlayer? = null // 追加
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 = "こんばんは"
}
//greeting += "。。。ひつじが1匹。。。ひつじが2匹。。。ひつじが3匹。。。"
//val sheepNum = 10
//for (i in 1..sheepNum) {
// greeting += "。。。ひつじが" + i + "匹"
//}
greeting += "ねむれませんか?"
textview.text = greeting
//findViewById<TextView>(R.id.textview).text = greeting
mp = MediaPlayer.create(applicationContext, R.raw.sheep_cry1) // 追加
rootLayout.setOnClickListener {
sheepCount++
val sheepText = "ひつじが$sheepCount 匹"
textview.text = sheepText
when(sheepCount % 2) {
0 -> { // 追加
imageView1.setImageResource(R.drawable.sheep_1) // 追加
mp?.start() // 追加
}
else -> imageView1.setImageResource(R.drawable.sheep_2)
}
}
}
}
初めてのAndroidアプリ開発(Kotlin編)
スリープから回復してきた時に呼び出される処理を追加
コード
▼/MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.media.MediaPlayer
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
class MainActivity : AppCompatActivity() {
var sheepCount = 0
var mp: MediaPlayer? = null
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 = "こんばんは"
}
//greeting += "。。。ひつじが1匹。。。ひつじが2匹。。。ひつじが3匹。。。"
//val sheepNum = 10
//for (i in 1..sheepNum) {
// greeting += "。。。ひつじが" + i + "匹"
//}
greeting += "ねむれませんか?"
textview.text = greeting
//findViewById<TextView>(R.id.textview).text = greeting
mp = MediaPlayer.create(applicationContext, R.raw.sheep_cry1)
rootLayout.setOnClickListener {
sheepCount++
val sheepText = "ひつじが$sheepCount 匹"
textview.text = sheepText
when(sheepCount % 2) {
0 -> {
imageView1.setImageResource(R.drawable.sheep_1)
mp?.start()
}
else -> imageView1.setImageResource(R.drawable.sheep_2)
}
}
}
// ↓ここに追加
override fun onPause() {
super.onPause()
Log.i("onPause", "眠るまでの回数=" + sheepCount)
}
}
アプリが終了しても値を残す
値を保存する
SharedPreferences クラスを使用する
コード
▼MainActivity.kt
package work.w4c.android0.introducesleep20180426
import android.content.SharedPreferences
import android.media.MediaPlayer
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.preference.PreferenceManager
import android.util.Log
import android.widget.TextView
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
class MainActivity : AppCompatActivity() {
var sheepCount = 0
var mp: MediaPlayer? = null
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 = "こんばんは"
}
//greeting += "。。。ひつじが1匹。。。ひつじが2匹。。。ひつじが3匹。。。"
//val sheepNum = 10
//for (i in 1..sheepNum) {
// greeting += "。。。ひつじが" + i + "匹"
//}
greeting += "ねむれませんか?"
textview.text = greeting
//findViewById<TextView>(R.id.textview).text = greeting
mp = MediaPlayer.create(applicationContext, R.raw.sheep_cry1)
rootLayout.setOnClickListener {
sheepCount++
val sheepText = "ひつじが$sheepCount 匹"
textview.text = sheepText
when(sheepCount % 2) {
0 -> {
imageView1.setImageResource(R.drawable.sheep_1)
mp?.start()
}
else -> imageView1.setImageResource(R.drawable.sheep_2)
}
}
}
override fun onPause() {
super.onPause()
Log.i("onPause", "眠るまでの回数=$sheepCount")
//値を保存する
val sp: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) //追加
sp.edit().putInt("SheepCount", sheepCount).apply() //追加
}
//保存した値を読み出す
override fun onResume() {
super.onResume()
val sp: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) //追加
val count = sp.getInt("SheepCount", -1) //追加
if (count >= 0) { //追加
textview.text = "前回は$count 回羊を数えました。" //追加
} //追加
}
}
初めてのAndroidアプリ開発(Kotlin編)