みなさまこんにちは〜!
メモリアインクのすだです。
本日は、
KotlinのActivityResultLauncherを使って他Activityからの結果を受け取る機能を
実際のコードを利用して徹底解説していきます!
この記事を読んでわかること…
・ActivityResultLauncherとは?
・ActivityResultLauncher の使い方
・ActivityResultLauncherを使ったActivity間のデータ受け渡し方法
環境
- Kotlin (ver 1.9.0)
- Android Studio (Giraffe | 2022.3.1 Patch 3)
ActivityResultLauncher とは?
ActivityResultLauncher
は、Androidでアクティビティ間のデータ受け渡しを行うためのクラスです。
androidx.activity.result
パッケージに属するクラスで、
アクティビティやフラグメントから別のアクティビティを起動し、その結果を非同期で受け取る役割を担います。
元々この機能は、startActivityForResult
と onActivityResult
が担っていましたが
こちらの2つは Android 11 (API 30) 以降で非推奨となりました。
それに代わる形導で導入されたActivityResultLauncher
は、より簡潔でエラーが少ないコードを書くことができます。
ActivityResultLauncherの活用例
ActivityResultLauncherは基本的に、
別のアクティブティを起動して、その結果を元のアクティビティやフラグメントに返すために使われます。
例えば、以下のようなシーンで利用することができます。
カメラやギャラリーの起動
真を撮影したり、ギャラリーから画像を選択する際に、結果として選んだ画像のURIを受け取る。
設定画面の起動と反映
設定画面を開いて、設定が完了した後に元の画面に戻り、変更内容を反映する。
ファイル選択
ユーザーがファイルを選択して、そのファイルのパスや内容を取得する。
ActivityResultLauncher の使い方
それでは、早速実装してみましょう!
今回は例として
ボタンを押下するとログイン処理が走り、ログイン結果に応じて「管理者用のview」か「一般ユーザー用のview」になるよう処理を分けみます。
イメージとしては
- A画面 (MainActivity) でボタンを押すと、B画面 (LoginActivity) が起動
- B画面でログイン処理を行う
- A画面に戻った際に
ActivityResultLauncher
がログイン結果を受け取る - 結果に応じて、画面遷移処理を分岐
こんな感じです。
A画面 (MainActivity)
class MainActivity : AppCompatActivity() {
private lateinit var loginLauncher: ActivityResultLauncher<Intent>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ActivityResultLauncherの登録
loginLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
result.data?.let { data ->
val isUserAdmin = data.getBooleanExtra("isAdmin", false)
if (isUserAdmin) {
fetchAdminData()
} else {
fetchUserData()
}
finish()
}
}
}
// ボタンを押したらログイン画面へ遷移
val loginButton: Button = findViewById(R.id.loginButton)
loginButton.setOnClickListener {
val intent = Intent(this, LoginActivity::class.java)
loginLauncher.launch(intent)
}
}
}
サンプルコードの解説
9行目:
registerForActivityResult
は、アクティビティやフラグメントで他の画面を起動し、
その結果を受け取るための仕組みです。ActivityResultContracts.StartActivityForResult()
は、
「別のアクティビティを起動して、結果を受け取る契約 (Contract)」を意味します。- この部分で、
loginLauncher
というActivityResultLauncher
が登録されます。
10〜12行目:
result
には、起動したアクティビティから返された結果 (resultCode) やデータ (Intent) が格納されます。result.resultCode
でアクティビティの終了状態を判定します。Activity.RESULT_OK
は、ログインが成功したことを示します。- 受け取ったデータ (data) を使って、遷移先を柔軟に変更できます。
B画面 (LoginActivity)
class LoginActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
val loginButton: Button = findViewById(R.id.loginButton)
loginButton.setOnClickListener {
val resultIntent = Intent().apply {
putExtra("isAdmin", true)
putExtra("userName", "John Doe")
}
setResult(Activity.RESULT_OK, resultIntent)
finish() // B画面 (LoginActivity) を終了してA画面に結果を返す
}
}
}
サンプルコードの解説
9〜13行目:
putExtra
メソッドを使ってIntent
にデータをセットします。- その後、
setResult(Activity.RESULT_OK, resultIntent)
で結果をセットして終了します。 finish()
を呼ぶことでLoginActivity
が終了し、A画面に戻ります。
まとめ
おつかれさまでした。いかがでしたでしょうか!
ActivityResultLauncher
を使うことで、データのやり取りや分岐処理がスムーズに記述できるようになります。
ぜひ覚えて、アプリ開発で試してみてくださいね〜!
技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
自分の市場価値をさらに向上させてみませんか?
コメント