幕間:ガバガバアプリ開発の行く末は?
今のところQiita記事用のアプリを作りつつ、自分の趣味用にTRPGキャラ管理ツールを作っています。正直、分からないことだらけで進めているのでやってて楽しいです。今はデータクラスの作り方を勉強中なので、その内その内容も記事にしたいなと思っています。Gitでサンプルコードみたいなもの公開すると良さそう?あと、量子計算の勉強をしてたら投稿に間を開けてしまいました。
画面遷移をしよう
とりあえず調べた内容をまとめます。Androidアプリの画面遷移は別のActivityの呼び出しに相当するらしいです。
とりあえず始めにActivityの追加をしましょう。
左の[App]を右クリックして、[New] → [Activity] → [Empty Activity]を選択。
Activityの名前は好きに決めてください。他の変更は必要ありません。(今回の例ではMain2Activityになっています)
Activityの呼び出しはIntentという仕組みを使います。
IntentはActivityからActivityへ情報を移すための箱だと考えてください。箱には宛先が書かれますが、宛先が既に決まっているもの(明示的Intent)とシステムが条件を判断し、送り先を決めるもの(暗黙的Intent)の2つのパターンがあります。
※詳しくはここ見て
今回は、ボタンを押したときにMainActivityからMain2Activityに遷移するものを作ります。
兎にも角にもIntentを使えるようにしよう。
import android.content.Intent
そしてMainActivity classに機能を追加。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent(this, Main2Activity::class.java)
button3.setOnClickListener {
startActivity(intent)
}
}
}
前回のHello World!を少し変えただけなので何となくわかるでしょう。たったこれだけで画面を遷移させることができる。
Intentに情報を追加しよう
「あれ?渡したい情報が入ってないやん!どうしてくれんのこれ」と思った人もいるだろう。
ここで今回も簡単な例を示すことで説明する。
結論だけ述べれば、IntentクラスのputExtra()メソッドを使う。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var count = 0
val intent = Intent(this, Main2Activity::class.java)
button1.setOnClickListener {
count += 1
}
button2.setOnClickListener {
intent.putExtra("count", count)
startActivity(intent)
}
}
}
機能は簡単でbuttan1を押した回数を記録し、Main2Activityに遷移する。注目すべきは、
intent.putExtra("count", count)
の部分だ。putExtra()メソッドは第1引数にキー、第2引数に渡す値を指定している。この時、型の指定は必要ありません。
次は受け取り側のMain2Activityを見よう。
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val intent = Intent(getIntent())
val num = intent.getIntExtra("count", 0)
countNumber.text = num.toString()
}
}
こちらは端末画面にbutton1を押した回数を表示するようになっている。
countNumberはTextViewのIDなので気にしないでほしい。注目すべきは、
val intent = Intent(getIntent())
val num = intent.getIntExtra("count", 0)
の部分だ。getIntent()は自身が呼び出されたときに送られたIntentを取得している。
そして、getIntExtra("count", 0)を見ればわかるだろうが、情報の追加時には型を指定しなかった代わりに呼び出し側ではメソッド名によって型を指定している。型ごとにまとめると、
型 | メソッド | 第1引数 | 第2引数 |
---|---|---|---|
Int | getIntExtra() | キー | キーが見つからない時の戻り値 |
String | getStringExtra() | キー | なし(キーが見つからない時はNull) |
Boolean | getBooleanExtra() | キー | キーが見つからない時の戻り値 |
となっている。
次回
特に次の本編で何を書くか決めていないです。というのも、また本筋から離れた話(小数点が付く)をすると思うので本編の内容はその時に伝えます。とりあえず、小数点の方はNearby Connections APIを使う話になります。
記事書いてるとその時に読んでる本の語調に似てしまうのは何故なのか?未だに書くに慣れない。