今回は、Android Studioでアプリの画面遷移部分の書き方を紹介します。言語はkotlinです。アプリを起動したらトップ画面を表示し、特定のボタンなどをタップすると別の画面を表示するというものですね。ここではActivityからActivityへの遷移を扱います。なお、レイアウトの書き方については割愛します。また別の記事で作成予定です。
画面遷移はGUIアプリを作成したことのある方にとっては馴染みのあるものだと思いますが、AndroidアプリではAndroidManifest.xmlも書くことになり、個人的にあまり馴染みが無かったのでその覚書も兼ねて書いていきます。
実現したいこと
ファイル構成としては下記のようなものを題材とします。MainActivityは前回の記事で紹介したOCR機能の画面とします。そこに新たに、アプリ起動時に表示される画面としてStartActivityを作ることにします。下記のようなファイル構成ですね。(本当はlayoutのxmlもあります)

画面のレイアウトは下記のように作成しました。


アプリを起動するとStartActivityが表示され、カメラ読み取りボタンを押すとMainActivityに遷移し、OCR実行した後に決定で元の画面に戻り読み取った文字をテキスト入力欄に反映するという流れです。
StartActivity.kt
StartActivityからMainActivityへ遷移する処理についてです。
|
1 2 3 4 5 6 7 8 9 10 11 |
private lateinit var btnCamera: Button override fun onCreate(savedInstanceState: Bundle?) { btnCamera = findViewById(R.id.btnCamera) // カメラ画面を起動し、読み取ったテキストを受け取る準備 btnCamera.setOnClickListener { val intent = Intent(this, MainActivity::class.java) startCameraForResult.launch(intent) } } |
- MainActivityへ移動するIntentを作成(thisはStartActivity自身)
- startCameraForResultで戻って来た際に結果を受け取るように待機
- MainActivityから戻ってくるとstartCameraForResultの中身が実行される
※startCameraForResultの実装は本題ではないので、ここでは割愛します
MainActivity.kt
MainActivityにおける元の画面(StartActivity)に戻る処理です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private lateinit var btnConfirm: Button override fun onCreate(savedInstanceState: Bundle?) { btnConfirm = findViewById(R.id.btnConfirm) // 決定ボタン → 元の画面に戻る btnConfirm.setOnClickListener { val resultIntent = Intent() resultIntent.putExtra("recognized_text", txtResult.text.toString()) setResult(RESULT_OK, resultIntent) finish() } } |
- 元の画面に取得したデータを渡すためにresultIntentというIntentを作ります。
- resultIntentに”recognized_text”という名前を付け、取得したテキストデータを置きます。
- setResultで正常完了のRESULT_OKステータスと共に先ほどのresultIntentをセットします。
- 最後にfinishでこの画面(MainActivity)を閉じます。
AndroidManifest.xml
さいごに、AndroidManifestに情報を追記します。
Manifestには遷移させたい画面の情報を書きます。nameに書かれている通り、上のactivityがStartActivity用で、下のactivityがMainActivity用です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<application <activity android:name="com.ailistech.appname.StartActivity" android:exported="true" android:theme="@style/Theme.AppName"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.ailistech.appname.MainActivity" android:exported="false" android:theme="@style/Theme.AppName" /> </application> |
exportedというのは、このアプリの外(例えばスマホのホーム画面のアイコンなど)から呼び出せるかどうかを設定するところです。今回は、StartActivityがトップとなるのでtrue、その他ではfalseとします。
intent-filterのaction.MAINというのは、このアプリのメインのエントリポイントであることを表しています。また、先ほどのexportedをtrueと共に、ホーム画面のアイコンから起動したい場合は、category.LAUNCHERとします。
おわりに
大まかな手順を確認します。
- 各layout.xml作成(今回は割愛)
- 各Activity.ktを実装
- AndroidManifest.xmlに情報を追記
書いてみるとこれだけなんですが、WindowsアプリやVBAのユーザーフォームなどに慣れていると少し戸惑ってしまいます。
画面表示の切り替えだけであればFragmentを使う方法もあるので、機会があれば記事を書いてみようと思います。
以上、最後まで読んでいただきありがとうございました。
